<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>CRT Startup codeC++程序的生前死后 | whoway</title>
    <meta name="description" content="Personal Blog Website">
    <link rel="icon" href="/images/photo.jpg">
  <link rel="manifest" href="/images/photo.jpg">
  <link rel="apple-touch-icon" href="/images/photo.jpg">
  <meta http-quiv="pragma" cotent="no-cache">
  <meta http-quiv="pragma" cotent="no-cache,must-revalidate">
  <meta http-quiv="expires" cotent="0">
    
    <link rel="preload" href="/assets/css/0.styles.0dbae9ec.css" as="style"><link rel="preload" href="/assets/js/app.c70e21ad.js" as="script"><link rel="preload" href="/assets/js/32.063c672d.js" as="script"><link rel="prefetch" href="/assets/js/10.15222a53.js"><link rel="prefetch" href="/assets/js/100.7e0e5a86.js"><link rel="prefetch" href="/assets/js/101.efd59f25.js"><link rel="prefetch" href="/assets/js/102.dfbdc06c.js"><link rel="prefetch" href="/assets/js/103.d3ab2109.js"><link rel="prefetch" href="/assets/js/104.117957ef.js"><link rel="prefetch" href="/assets/js/105.046e8ff3.js"><link rel="prefetch" href="/assets/js/106.aebdc17d.js"><link rel="prefetch" href="/assets/js/107.248733c2.js"><link rel="prefetch" href="/assets/js/108.a2fecadc.js"><link rel="prefetch" href="/assets/js/109.35196857.js"><link rel="prefetch" href="/assets/js/11.770642f2.js"><link rel="prefetch" href="/assets/js/110.cf3d973c.js"><link rel="prefetch" href="/assets/js/111.f985889a.js"><link rel="prefetch" href="/assets/js/112.ad614f41.js"><link rel="prefetch" href="/assets/js/113.f666653c.js"><link rel="prefetch" href="/assets/js/114.c6c3f384.js"><link rel="prefetch" href="/assets/js/115.e51d3c2f.js"><link rel="prefetch" href="/assets/js/116.4f4b39f5.js"><link rel="prefetch" href="/assets/js/117.99352e11.js"><link rel="prefetch" href="/assets/js/118.c6ae6572.js"><link rel="prefetch" href="/assets/js/119.4ccbe778.js"><link rel="prefetch" href="/assets/js/12.042a92ff.js"><link rel="prefetch" href="/assets/js/120.edda1c4f.js"><link rel="prefetch" href="/assets/js/121.30a638ed.js"><link rel="prefetch" href="/assets/js/122.6efcefb1.js"><link rel="prefetch" href="/assets/js/123.91e6665b.js"><link rel="prefetch" href="/assets/js/124.f27e3d7e.js"><link rel="prefetch" href="/assets/js/125.c75712d5.js"><link rel="prefetch" href="/assets/js/126.ed756cce.js"><link rel="prefetch" href="/assets/js/127.2f06c74c.js"><link rel="prefetch" href="/assets/js/128.d5f6f30e.js"><link rel="prefetch" href="/assets/js/129.508b7eed.js"><link rel="prefetch" href="/assets/js/13.b5280c37.js"><link rel="prefetch" href="/assets/js/130.dc05f9aa.js"><link rel="prefetch" href="/assets/js/131.e0ba69b1.js"><link rel="prefetch" href="/assets/js/132.d79bcaa4.js"><link rel="prefetch" href="/assets/js/133.34acc01a.js"><link rel="prefetch" href="/assets/js/134.dabf64d5.js"><link rel="prefetch" href="/assets/js/135.ad90c915.js"><link rel="prefetch" href="/assets/js/136.dbb0074f.js"><link rel="prefetch" href="/assets/js/137.284ad365.js"><link rel="prefetch" href="/assets/js/138.a4b6856f.js"><link rel="prefetch" href="/assets/js/139.c9c1e20f.js"><link rel="prefetch" href="/assets/js/14.df02ba38.js"><link rel="prefetch" href="/assets/js/140.8b0a9269.js"><link rel="prefetch" href="/assets/js/141.9c7759c5.js"><link rel="prefetch" href="/assets/js/142.a4201a82.js"><link rel="prefetch" href="/assets/js/143.d7da6e8c.js"><link rel="prefetch" href="/assets/js/144.5e48e65d.js"><link rel="prefetch" href="/assets/js/145.a0e2633c.js"><link rel="prefetch" href="/assets/js/146.3c775f9b.js"><link rel="prefetch" href="/assets/js/147.22add89a.js"><link rel="prefetch" href="/assets/js/148.cfde1009.js"><link rel="prefetch" href="/assets/js/149.ffc835b5.js"><link rel="prefetch" href="/assets/js/15.fbdfc4ee.js"><link rel="prefetch" href="/assets/js/150.406c4b20.js"><link rel="prefetch" href="/assets/js/151.b2040eea.js"><link rel="prefetch" href="/assets/js/152.7bc65661.js"><link rel="prefetch" href="/assets/js/153.1d7c65e3.js"><link rel="prefetch" href="/assets/js/154.1309de49.js"><link rel="prefetch" href="/assets/js/155.81d3ee1f.js"><link rel="prefetch" href="/assets/js/156.154a4ef2.js"><link rel="prefetch" href="/assets/js/16.e5eb6147.js"><link rel="prefetch" href="/assets/js/17.57853c4a.js"><link rel="prefetch" href="/assets/js/18.cb9d7518.js"><link rel="prefetch" href="/assets/js/19.f354dc47.js"><link rel="prefetch" href="/assets/js/2.570d8a23.js"><link rel="prefetch" href="/assets/js/20.b5af7fad.js"><link rel="prefetch" href="/assets/js/21.0b1928fe.js"><link rel="prefetch" href="/assets/js/22.f78666de.js"><link rel="prefetch" href="/assets/js/23.29c3f366.js"><link rel="prefetch" href="/assets/js/24.6f596516.js"><link rel="prefetch" href="/assets/js/25.14067b60.js"><link rel="prefetch" href="/assets/js/26.74ba4989.js"><link rel="prefetch" href="/assets/js/27.13d60edd.js"><link rel="prefetch" href="/assets/js/28.9523cb32.js"><link rel="prefetch" href="/assets/js/29.8ec842e9.js"><link rel="prefetch" href="/assets/js/3.3fb3d2e0.js"><link rel="prefetch" href="/assets/js/30.805597a8.js"><link rel="prefetch" href="/assets/js/31.831b195d.js"><link rel="prefetch" href="/assets/js/33.6d93fac3.js"><link rel="prefetch" href="/assets/js/34.56e8263c.js"><link rel="prefetch" href="/assets/js/35.dbe688bb.js"><link rel="prefetch" href="/assets/js/36.dc5af2c1.js"><link rel="prefetch" href="/assets/js/37.0a7494f6.js"><link rel="prefetch" href="/assets/js/38.fe4fc171.js"><link rel="prefetch" href="/assets/js/39.f5ed5e92.js"><link rel="prefetch" href="/assets/js/4.2c405ec8.js"><link rel="prefetch" href="/assets/js/40.fe7e2714.js"><link rel="prefetch" href="/assets/js/41.30b0811d.js"><link rel="prefetch" href="/assets/js/42.76f52d62.js"><link rel="prefetch" href="/assets/js/43.e7bb0817.js"><link rel="prefetch" href="/assets/js/44.ead0e883.js"><link rel="prefetch" href="/assets/js/45.235df046.js"><link rel="prefetch" href="/assets/js/46.5f09e829.js"><link rel="prefetch" href="/assets/js/47.67116354.js"><link rel="prefetch" href="/assets/js/48.31f34543.js"><link rel="prefetch" href="/assets/js/49.10b5ebba.js"><link rel="prefetch" href="/assets/js/5.6f47322c.js"><link rel="prefetch" href="/assets/js/50.c0f0b7f1.js"><link rel="prefetch" href="/assets/js/51.5143f3bf.js"><link rel="prefetch" href="/assets/js/52.eeddfd48.js"><link rel="prefetch" href="/assets/js/53.eb790db5.js"><link rel="prefetch" href="/assets/js/54.8fe5421c.js"><link rel="prefetch" href="/assets/js/55.d8f9004b.js"><link rel="prefetch" href="/assets/js/56.62ac9b92.js"><link rel="prefetch" href="/assets/js/57.a9caec0d.js"><link rel="prefetch" href="/assets/js/58.f93fc522.js"><link rel="prefetch" href="/assets/js/59.a81a03aa.js"><link rel="prefetch" href="/assets/js/6.8c2ea393.js"><link rel="prefetch" href="/assets/js/60.ab782775.js"><link rel="prefetch" href="/assets/js/61.6dd12daf.js"><link rel="prefetch" href="/assets/js/62.76f4b01f.js"><link rel="prefetch" href="/assets/js/63.6f8a4742.js"><link rel="prefetch" href="/assets/js/64.6f8bb1fa.js"><link rel="prefetch" href="/assets/js/65.4120a44b.js"><link rel="prefetch" href="/assets/js/66.360c2d2b.js"><link rel="prefetch" href="/assets/js/67.26f84d32.js"><link rel="prefetch" href="/assets/js/68.68f45e5e.js"><link rel="prefetch" href="/assets/js/69.e311eb56.js"><link rel="prefetch" href="/assets/js/7.6762b2d7.js"><link rel="prefetch" href="/assets/js/70.cea82674.js"><link rel="prefetch" href="/assets/js/71.783ddcf7.js"><link rel="prefetch" href="/assets/js/72.e5467385.js"><link rel="prefetch" href="/assets/js/73.b8fb681b.js"><link rel="prefetch" href="/assets/js/74.1bae37db.js"><link rel="prefetch" href="/assets/js/75.024387e5.js"><link rel="prefetch" href="/assets/js/76.a8e53010.js"><link rel="prefetch" href="/assets/js/77.8c55500a.js"><link rel="prefetch" href="/assets/js/78.7ce90bf5.js"><link rel="prefetch" href="/assets/js/79.ef71713f.js"><link rel="prefetch" href="/assets/js/8.788a6364.js"><link rel="prefetch" href="/assets/js/80.acad589d.js"><link rel="prefetch" href="/assets/js/81.02670d10.js"><link rel="prefetch" href="/assets/js/82.53b7b1ac.js"><link rel="prefetch" href="/assets/js/83.99eb8581.js"><link rel="prefetch" href="/assets/js/84.d1535ce3.js"><link rel="prefetch" href="/assets/js/85.fe2b7de9.js"><link rel="prefetch" href="/assets/js/86.41850272.js"><link rel="prefetch" href="/assets/js/87.1cdc6df9.js"><link rel="prefetch" href="/assets/js/88.01bf3461.js"><link rel="prefetch" href="/assets/js/89.17c69819.js"><link rel="prefetch" href="/assets/js/9.3813842d.js"><link rel="prefetch" href="/assets/js/90.f6ae7e35.js"><link rel="prefetch" href="/assets/js/91.507bc284.js"><link rel="prefetch" href="/assets/js/92.90551782.js"><link rel="prefetch" href="/assets/js/93.dc442d78.js"><link rel="prefetch" href="/assets/js/94.315f4e94.js"><link rel="prefetch" href="/assets/js/95.ccd6c6bf.js"><link rel="prefetch" href="/assets/js/96.0c6d89d0.js"><link rel="prefetch" href="/assets/js/97.1a9f10a9.js"><link rel="prefetch" href="/assets/js/98.43be3caa.js"><link rel="prefetch" href="/assets/js/99.54c8207b.js">
    <link rel="stylesheet" href="/assets/css/0.styles.0dbae9ec.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">whoway</span></a> <div class="links" style="max-width:nullpx;"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">🎓Coding</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/00.Coding/TheBeautyOfProgramming/" class="nav-link">🔖编程之美题解</a></li><li class="dropdown-item"><!----> <a href="/00.Coding/CodeWarehouse/" class="nav-link">🔖代码意识流</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">🚀语言</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/01.Language/Overview/" class="nav-link">🔖概述</a></li><li class="dropdown-item"><!----> <a href="/01.Language/C/" class="nav-link">⭐️C</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Cpp/" class="nav-link router-link-active">🚀C++</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Java/" class="nav-link">☕️Java</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Python/" class="nav-link">🧩Python3</a></li></ul></div></div><div class="nav-item"><a href="/02.Hardware/" class="nav-link">✔️硬件基础</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">⭐️软件基础</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/03.Software/01.DataStructureAndAlgorithm/" class="nav-link">🐾数据结构和算法</a></li><li class="dropdown-item"><!----> <a href="/03.Software/02.OS/" class="nav-link">💻操作系统</a></li><li class="dropdown-item"><!----> <a href="/03.Software/03.Net/" class="nav-link">☁️计算机网络</a></li><li class="dropdown-item"><!----> <a href="/03.Software/04.SE/" class="nav-link">✅软件工程</a></li></ul></div></div><div class="nav-item"><a href="/04.Database/" class="nav-link">🎨数据库</a></div><div class="nav-item"><a href="/05.Engineer/" class="nav-link">🔖学术/工程</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">⚙️工具</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/06.Tools/01.employment/" class="nav-link">🔖求职</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/02.efficiency/" class="nav-link">🚀效能</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/03.windows/" class="nav-link">⚙️Windows</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/04.design/" class="nav-link">🧩设计</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/05.linux/" class="nav-link">🐉Linux</a></li></ul></div></div><div class="nav-item"><a href="https://github.com/whoway" target="_blank" rel="noopener noreferrer" class="nav-link external">
  GitHub
  <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <!----></nav></div></header> <div class="sidebar-mask"></div> <div class="sidebar"><nav class="nav-links"><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">🎓Coding</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/00.Coding/TheBeautyOfProgramming/" class="nav-link">🔖编程之美题解</a></li><li class="dropdown-item"><!----> <a href="/00.Coding/CodeWarehouse/" class="nav-link">🔖代码意识流</a></li></ul></div></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">🚀语言</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/01.Language/Overview/" class="nav-link">🔖概述</a></li><li class="dropdown-item"><!----> <a href="/01.Language/C/" class="nav-link">⭐️C</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Cpp/" class="nav-link router-link-active">🚀C++</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Java/" class="nav-link">☕️Java</a></li><li class="dropdown-item"><!----> <a href="/01.Language/Python/" class="nav-link">🧩Python3</a></li></ul></div></div><div class="nav-item"><a href="/02.Hardware/" class="nav-link">✔️硬件基础</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">⭐️软件基础</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/03.Software/01.DataStructureAndAlgorithm/" class="nav-link">🐾数据结构和算法</a></li><li class="dropdown-item"><!----> <a href="/03.Software/02.OS/" class="nav-link">💻操作系统</a></li><li class="dropdown-item"><!----> <a href="/03.Software/03.Net/" class="nav-link">☁️计算机网络</a></li><li class="dropdown-item"><!----> <a href="/03.Software/04.SE/" class="nav-link">✅软件工程</a></li></ul></div></div><div class="nav-item"><a href="/04.Database/" class="nav-link">🎨数据库</a></div><div class="nav-item"><a href="/05.Engineer/" class="nav-link">🔖学术/工程</a></div><div class="nav-item"><div class="dropdown-wrapper"><a class="dropdown-title"><span class="title">⚙️工具</span> <span class="arrow right"></span></a> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/06.Tools/01.employment/" class="nav-link">🔖求职</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/02.efficiency/" class="nav-link">🚀效能</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/03.windows/" class="nav-link">⚙️Windows</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/04.design/" class="nav-link">🧩设计</a></li><li class="dropdown-item"><!----> <a href="/06.Tools/05.linux/" class="nav-link">🐉Linux</a></li></ul></div></div><div class="nav-item"><a href="https://github.com/whoway" target="_blank" rel="noopener noreferrer" class="nav-link external">
  GitHub
  <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></div> <!----></nav>  <ul class="sidebar-links"><li><div class="sidebar-group first"><p class="sidebar-heading open"><span>CRT Startup codeC++程序的生前死后</span> <!----></p> <ul class="sidebar-group-items"><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#📑目录" class="sidebar-link">📑目录</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#_01-前言，如何自定-startup-code" class="sidebar-link">01.前言，如何自定 Startup code</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt-c-程序的生前死後" class="sidebar-link">PPT.C++程序的生前死後</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt-一些问题" class="sidebar-link">PPT.一些问题</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt-书籍" class="sidebar-link">PPT.书籍</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#设定「startup-code启动代码」" class="sidebar-link">设定「startup code启动代码」</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ccccc" class="sidebar-link">ccccc</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt-上面讲解了好久" class="sidebar-link">PPT.上面讲解了好久</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt-我们在linux底下写一个「startup-code」" class="sidebar-link">PPT.我们在linux底下写一个「startup code」</a></li></ul></li><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#_02-默认的-startup-code-在哪儿，main-生前和死后的-call" class="sidebar-link">02.默认的 Startup code 在哪儿，main 生前和死后的 Call</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt-call-stack🚀🚀🚀" class="sidebar-link">PPT. call stack🚀🚀🚀</a></li></ul></li><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#_03-startup-code源码摘要" class="sidebar-link">03.Startup code源码摘要</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#函数maincrtstartup-void" class="sidebar-link">函数mainCRTStartup(void)</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#c-的生前-时后具体代码对应1-7和9" class="sidebar-link">C++的生前+时后具体代码对应1-7和9</a></li></ul></li><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#_04-heap-init-startup的首要工程（上）🚀✔️" class="sidebar-link">04. heap init Startup的首要工程（上）🚀✔️</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt-sbh-small-block-heap" class="sidebar-link">PPT.SBH :Small Block Heap</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#调试模式" class="sidebar-link">调试模式</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#小区块" class="sidebar-link">小区块</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#vc10不见的vc6" class="sidebar-link">VC10不见的VC6</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#第3ppt" class="sidebar-link">第3PPT</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#_16个header长相" class="sidebar-link">16个HEADER长相</a></li></ul></li><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#_05-内存分配精解（一）" class="sidebar-link">05.内存分配精解（一）</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#_06-内存分配精解（二）" class="sidebar-link">06.内存分配精解（二）</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#_07-内存分配精解（三）" class="sidebar-link">07.内存分配精解（三）</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#_08-内存分配精解（四）" class="sidebar-link">08.内存分配精解（四）</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#_09-main-生前所有内存分配" class="sidebar-link">09.main 生前所有内存分配</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#_10-heapalloc-角色与影响" class="sidebar-link">10. HeapAlloc 角色与影响</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt-windows-heap-management" class="sidebar-link">PPT.Windows Heap Management</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt41" class="sidebar-link">PPT41</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt42" class="sidebar-link">PPT42.</a></li></ul></li><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#_11-io-init-startup的第2项大工程🚀✔️" class="sidebar-link">11._io_init() Startup的第2项大工程🚀✔️</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt-侯捷对file的描述🚀" class="sidebar-link">PPT.侯捷对file的描述🚀</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#核心" class="sidebar-link">核心</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt46" class="sidebar-link">PPT46</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#_31-30就没有了✔️✔️✔️" class="sidebar-link">31.30就没有了✔️✔️✔️</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt47" class="sidebar-link">PPT47</a></li></ul></li><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#_12-cinit-startup的第3项大工程🚀✔️" class="sidebar-link">12. __cinit() Startup的第3项大工程🚀✔️</a><ul class="sidebar-sub-headers"><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt48" class="sidebar-link">PPT48</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt49" class="sidebar-link">PPT49</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt50" class="sidebar-link">PPT50</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt47-2" class="sidebar-link">PPT47</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#启动码的初始化全部讲完了" class="sidebar-link">启动码的初始化全部讲完了</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt48-2" class="sidebar-link">PPT48</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#我们整个-i-o-initialization-都讲完了" class="sidebar-link">我们整个==i o initialization 都讲完了==</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#ppt51" class="sidebar-link">PPT51</a></li><li class="sidebar-sub-header"><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#fclose的底层！！" class="sidebar-link">fclose的底层！！</a></li></ul></li><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#cinit-感觉没有讲🚀🚀" class="sidebar-link">__cinit() 感觉没有讲🚀🚀</a><ul class="sidebar-sub-headers"></ul></li><li><a href="/01.Language/Cpp/PPT05.C%2B%2BStartup%E6%8F%AD%E5%AF%86C%2B%2B%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%94%9F%E5%89%8D%E5%92%8C%E6%AD%BB%E5%90%8E.html#参考资料" class="sidebar-link">参考资料</a><ul class="sidebar-sub-headers"></ul></li></ul></div></li></ul> </div> <div class="page"> <div class="content"><h1 id="crt-startup-codec-程序的生前死后"><a href="#crt-startup-codec-程序的生前死后" class="header-anchor">#</a> <code>CRT Startup code</code>C++程序的生前死后</h1> <div class="language-txt line-numbers-mode"><pre class="language-text"><code>&lt;font style=&quot;background:yellow&quot;&gt;
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br></div></div><ul><li>startup，n.启动；开办</li> <li>✔️完成完成</li> <li>🚀表示B站补充</li></ul> <h2 id="📑目录"><a href="#📑目录" class="header-anchor">#</a> 📑目录</h2> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210705100013939.png" alt="image-20210705100013939"></p> <p>[TOC]</p> <h2 id="_01-前言，如何自定-startup-code"><a href="#_01-前言，如何自定-startup-code" class="header-anchor">#</a> 01.前言，如何自定 <code>Startup code</code></h2> <h3 id="ppt-c-程序的生前死後"><a href="#ppt-c-程序的生前死後" class="header-anchor">#</a> PPT.C++程序的生前死後</h3> <ul><li>&quot;启动码”</li> <li>揭密CRT Startup code</li> <li>这门课我们来谈谈一个什么样的题目呢？嗯比较奇特一些，也许呃你是你在实际上在网络上看到的课程名称会跟这个不太一样啊，因为“实在是不太好下这个名字。”现在我在投影片上呢呃暂时的把它下叫做C++程序的生前死后，呃或者叫做前世今生等等都可以。</li> <li>但他在技术上到底是在谈的是什么呢？
<ul><li>就是要揭秘，揭开一个CRT Startup code的命令。那么CRT Startup code Startup这个字啊，在商务上来讲就是新兴的公司！呃，但是它另外一个意思就是启动，也就是说这是一个启动代码。</li> <li>CRT是什么？
<ul><li><strong>C RunTime Library</strong>，也就是你在写C程序以及C++程序在<strong>最底层</strong>的部分为你服务的那一段 library那一段库叫做<strong>CRT</strong>，<font style="background:yellow;">在CRT这里头有一段很重要、很特别的代码，我们就叫Startup code，在你的程序还没有开始之前他就启动了</font></li></ul></li> <li>因此我们说你的C++程序的<strong>生前</strong>指的就是他，它已经启动了，然后才进入你的<font style="background:yellow;">进入点「Entry-Point」</font>，你的main的部分。可能是叫main，也可能是叫<code>Winmain</code>啊等，就是你自己写的entry point。等到你的那一部分结束之后呢！又归他管理，他又要做一些<strong>善后</strong>的工作。</li> <li>所以我们整个课程谈的就是<strong>CRT的这一部分</strong>，是Startup code的动作，所以我暂时就把它叫做程序的生前死后</li></ul></li></ul> <p>我们来想一想这些题目</p> <h3 id="ppt-一些问题"><a href="#ppt-一些问题" class="header-anchor">#</a> PPT.一些问题</h3> <ul><li>C++的<font style="background:pink;">进入点（Entry-Point）</font>是<code>main()</code>吗？
<ul><li>我想百分之99.999%的人回答是main，这个回答也没有错。</li> <li>但事实上就是我刚所说的，都比main更早执行的部分，有什么样的代码比里面更早被执行呢？<strong>我谈的是我们所写的代码啊</strong>，在C++里面。我们有写什么样的代码可以比main更早执行呢？
<ul><li>Q：有吗？</li> <li>A：有</li> <li>Q：是哪些呢？</li> <li>A：啊，这个后面会介绍到</li></ul></li></ul></li> <li>什么代码比<code>main()</code><strong>更早</strong>被执行？</li> <li>什么代码在<code>main()</code><strong>结束后</strong>才被执行？
<ul><li>注意这个也是我们写的代码，我问的是我们写的代码！</li> <li>有，也有，这些就是这个课程都会提到！</li> <li><strong>不但会提到是哪些代码会有这种特殊的行为，而且也会提到为什么他们为什么在main之前他在main之后被执行</strong>？</li></ul></li> <li>为什么上述代码可以如此行为？</li> <li>Heap的结构如何？</li> <li>I/O的结构如何？</li></ul> <p>按照我们的理解呢，我们所写的所有的代码都应该是那个生命范围涵盖在main之中，为什么能够有这么奇特的行为啊？我这就是我们要解释的。</p> <p>还有一个程序。很重要的一部分是Heap，就是内存的管理。<br>
那么整个windows呃整个C++程序的Heap的结构如何？<br>
C++程序也几乎避免不了IO啊，一个正常的C++程序，那么IO的结构又是如何？</p> <blockquote><p>课程的目标：PPT</p></blockquote> <ul><li><font style="background:yellow;">要回答这些问题，我们这个课程的目标就是要<strong>彻底的解决上一页所提的每一项疑问。</strong></font></li></ul> <blockquote><p>学习这门课，你应该具备什么样的基础呢？PPT</p></blockquote> <ul><li><p>只要你是一个C++ Programmer就可以了。</p></li> <li><p>这个说的有点含糊啊。嗯嗯，事实上会去注意到这个主题的人，大概都是你的编程功力、编程的时间啊已经。嗯，已经累积很多了，你开始对幕后的一些行为感到兴趣。所以这一部分和你真正在业界啊或者说在在学校里面要应付你自己的问题所写的代码，看我们今天这个课程所揭露的，其实没有什么关系。</p></li> <li><p>Q：呃有时候我上这门课的时候，我会比较夸张的啊跟同学们讲：这门课对你有帮助吗？</p> <ul><li>A：没有帮助啊，同学们听了就哈哈大笑。</li> <li>没有帮助，我们来上这门课做什么呢？</li> <li>但是这里面会有一些背后的东西是比较带着一种抽象的功能，抽象的帮助，让你知道的技术上的来龙去脉。所以要是你问我，嗯怎么样的人适合来听这门课呢？我实在也很难回答你啊，就是对于底层的行为感到兴趣的，你就可以来听这门课。</li></ul></li> <li><p>Q：需要什么样的技术基础才听得懂呢？</p> <ul><li>A：嗯也很难说，<strong>因为看起来没有什么不不能懂的啊，讲的每一件事情都很详细啊，只要认真去体会，没有什么不能懂。</strong></li></ul></li></ul> <blockquote><p>好，再往下，你将获得什么样的代码？PPT</p></blockquote> <ul><li>没有，<font style="background:yellow;"><strong>我们整个课程呢没有要写什么测试程序，但是我会挖一些源代码给你看</strong></font>，我们整个课程谈的是CRT的Startup code</li> <li><font style="background:yellow;">我们所观察的代码：<code>VC6和VC10</code></font></li></ul> <p>我就会挖出在windows底下的Startup code这个整个代码给你看</p> <p>也就是说我们在讲这些行为，呃他的它的来龙去脉、它的变化，如果只是告诉你观念，好像说服力还不够，<strong>我如果能够拿出它的源代码来作为佐证，那就那就掷地有声。</strong></p> <ul><li>所以我会带大家去看VC，因为我们是把目标锁定在windows平台下，所以我们看的是VC这个编译器所附的这个是Startup code的源代码，我会带你看VC6和VC10
<ul><li>为什么要看这2个版本呢？</li> <li>因为这其中有一个主题，他们在这两个版本上啊这有个跨度啊，他们表现的不一样。我会告诉你诶，我们在VC6里面深度挖掘下去的东西，很棒的，已经完全了解的东西到了VC10呢都不见了。那这是怎么一回事呢？<strong>其实技术的东西都在！他换了一个地方，换了一个层次出现了</strong>，所以我要带你看这两个版本，这是我们所观要观察的代码。</li></ul></li></ul> <h3 id="ppt-书籍"><a href="#ppt-书籍" class="header-anchor">#</a> PPT.书籍</h3> <p>呃这方面的书籍非常非常稀少，我们能够看到有这方面的书籍啊，这是我们呃，感到珍惜的地方。<br>
这有个国人写的这本书非常棒，这个叫《程序员的自我修养，链接装载与库》</p> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210705090440171.png" alt="image-20210705090440171"></p> <ul><li>这个作者在这边，三位作者合著，电子工业出版社，非常好的一本书。呃这个在台湾也有出版，这个是繁体版。名字有点变化了，各位也可以从这两边对对照啊，看一下一些不同的<strong>一些术语或者是称呼在两岸的不一样。</strong></li> <li>嗯这个书所涵盖的面积比我现在在谈这个课程还要多，我们这个课程毕竟也没有超过十个小时啊也不会超过10小时的一段课程，它涵盖的更多。</li></ul> <p>那么我们很遗憾的就是在书籍市场上有一些很棒的书籍，却可能只是因为出版年代稍微久远了，大家也就不重视。
我猜想想，像这样的书籍其实它都可以它的价值都可以跨越五年、十年或更多。那么能够花几十块钱就站在这些人的肩膀上面了，看看他们研究的成果呢是非常非常值得珍惜的事情啊，这个钱也非常值得花。</p> <p>嗯不过我确实不知道现在你还买不买得到这些书籍。好，那这个书籍呢主要以linux下面的这个系统的观察以及它的结果来呈现。</p> <p>那我，<font style="background:yellow;"><strong>这门课我们主要观察的是windows。</strong></font>
好，往下啊，现在来谈一谈。在一开始我给的那张投影片里面就谈到了。</p> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210705091215908.png" alt="image-20210705091215908"></p> <h3 id="设定「startup-code启动代码」"><a href="#设定「startup-code启动代码」" class="header-anchor">#</a> 设定「startup code启动代码」</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20210928201855.png" alt="image-20210928201854874"></p> <ul><li>下一步</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20210928201955.png" alt="image-20210928201954899"></p> <ul><li>下一步</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20210928202038.png" alt="image-20210928202038787"></p> <ul><li>我们要谈的是CRT的<code>Startup code</code>，他在哪里，他长什么样子还不知道，但是现在我先带领大家来从这一页来看看，<strong>如果我要自己写一个<code>Startup code</code>启动代码，我有没有机会？我该怎么做呢</strong>？</li> <li><font style="background:pink;">在<strong>VC6</strong>底下，我在他的帮助文档里面找到这一段文字，我会带着你看一遍。</font></li></ul> <p>这个意思是说这个<code>Startup code</code>在这一段文字里面叫做「<font style="background:yellow;">Entry-Point Symbol</font>」，叫进入点的一个符号，要怎么样去设定它？</p> <ul><li>如果你有能力自己写一段的话啊！当然这个难度是非常高，</li> <li>不过我等一下会表现出在windows底下和linux底下，我们都写一段，他基本上没做什么事情。如果是一个通用性的话，它难度就非常高！</li></ul> <p>好，你有能力写之后，你要怎么去设定它，使它能够启动。</p> <p>在VC6底下，你可以在这个文字啊，因为各位手上可以拿到这个投影片，所以可以慢慢看。
这里面有告诉你:在环境底下呢去click，去点/按什么样的设定，什么样的选项，就可以得到右上角这一个画面。
这个叫Projects Setting，项目设定：在这里头，这一个栏目上面，这个叫Entry-Point Symbol，就是我刚刚所念的这个Entry-Point Symbol，<strong>如果你自己写一个Startup code，那是一个函数，你就把函数的名称填到这里来</strong>！</p> <p>这样就是告诉整个系统，是什么系统呢？VC，啊这个画面是VC6，告诉他说请你在启动C++程序的时候从这个地方开始。</p> <h3 id="ccccc"><a href="#ccccc" class="header-anchor">#</a> ccccc</h3> <p>好，我们来看看这段文字：你只要输入一个function name，我刚刚说Startup code就是一个function name。在这个位置上，在这个位置上面，或者是在function argument的这一段啊这个就不管它了，因为这不是现在我们的状态。那么这个呃这样就可以了。这边要继续说这个函数呢，它必须define with the <code>_stdcall</code>，他必须以这一种方式来定义，</p> <ul><li>也就是说我们现在要开始学这一个function，这个function名字随便你取，但是他应该定为这一种调用习惯。calling convention</li> <li>呃我这里不详细解释。<font style="background:yellow;">calling conventions</font>，你上网很容易查得到，就是关系到函数在调用时候的参数的传递：是从左向右还是从右向左等等等的，这种习惯叫做calling convention</li> <li>那么有pass-by-value的形式，C的标准形式有什么face to call，有什么<code>_stdcall</code>等等等，这边告诉你要用这一种是叫<code>_stdcall</code>的形式来写。好。这边还说什么呢？这一个函数啊：名字随便你取，但是要用这一种调用（<code>_stdcall</code>）的习惯。而它的参数和它的返回类型、返回值都必须定义的，如定义的，如同在win32 API的这个WinMain的这一种形式来定义。</li></ul> <p>ok。其实我们。几乎是不会回避，有需要去写一个entry point！
好，我们继续看下去啊。
<strong>这个地方说，强烈建议你让linker来设定这个entry point</strong>，entry point就是我们现在讲的，这个函数呢强烈建议这么做，意思也就是不建议我们自己写，因为这个难度蛮高的。</p> <p>他说这么做的话，CRT library这里让linker去设定，而不是由你自己写。<br> <strong>这么做的话呢CRT就可以正确的初始化，而且C++的构造函数，注意这个for static objects，静态对象的构造函数就能够正确的执行</strong>。</p> <h3 id="ppt-上面讲解了好久"><a href="#ppt-上面讲解了好久" class="header-anchor">#</a> PPT.上面讲解了好久</h3> <p>这两句话什么意思？这两句话表现出来的也就是这个<code>Startup code</code> 的重要功能，所以除非你有把握写出治疗功能，否则请你不要自己写这种东西。什么东西啊——<code>Startup code</code></p> <p>我们在前面提到了一些大哉问，说什么样的代码里面更早，什么样的代码比练结束之后它执行。
这一段。也就对应到刚刚我们所看到这里所说的，这个Startup code能够让静态对象的构造函数在正确的时机被调动起来！
好，这部分这些观念可能对对很多的朋友们，我还是比较模模糊糊的啊，因为你可能从来，没接触过，我们慢慢会越来越清楚。</p> <p>好，我们再往下看，<font style="background:pink;">在预设情况下，<strong>这一个<code>Startup code</code>其实是有3个版本</strong></font></p> <ul><li>一个是这里又标了一、二、三，一个是针对（文字模式）底下那么它的我们所写的起的进入点是<font style="background:pink;"><code>main</code></font>，这个版本是针对他。</li> <li>第二个版本呢是针对windows底下，上面这个是console（文字模式），这个呢，是<font style="background:pink;">图形模式以下的<code>WinMains</code>或者是<code>wWinMain</code></font>，再看是不是在Unicode环境底下。</li> <li>那第三个版本是<font style="background:yellow;">针对DLL动态链接库</font>。</li></ul> <p>所以这种<code>Startup code</code>我们去待会儿我就要带你去看他的源代码了。
它应该有三个版本，分别针对这三种东西，看看使用者写的是这三个的哪一种！</p> <ul><li><strong>linker链接器就自动的会去找到对应的版本拿出来用</strong></li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210705093104052.png" alt="image-20210705093104052"></p> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token macro property"><span class="token directive-hash">#</span><span class="token directive keyword">include</span> <span class="token string">&lt;windows.h&gt;</span></span>

<span class="token keyword">int</span> <span class="token function">MyStartup</span><span class="token punctuation">(</span> <span class="token keyword">void</span> <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
	<span class="token keyword">int</span> a<span class="token operator">=</span><span class="token number">10</span><span class="token punctuation">;</span>
    <span class="token comment">//HeapCreate，调用一个windows的api函数去要到一些内存啊。</span>
	<span class="token comment">//还没有要到内存啊，这只是建立起一个系统，然后去从中呢分配一块内土。</span>
	HANDLE crtHeap<span class="token operator">=</span><span class="token function">HeapCreate</span><span class="token punctuation">(</span> HEAP_NO_SERIALIZE<span class="token punctuation">,</span> <span class="token number">0x010</span><span class="token punctuation">,</span> <span class="token number">4000</span><span class="token operator">*</span><span class="token number">1024</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>
    
	<span class="token keyword">int</span> <span class="token operator">*</span>p<span class="token operator">=</span><span class="token punctuation">(</span><span class="token keyword">int</span> <span class="token operator">*</span><span class="token punctuation">)</span><span class="token function">HeapAlloc</span><span class="token punctuation">(</span> crtHeap<span class="token punctuation">,</span> HEAP_ZERO_MEMORY<span class="token punctuation">,</span> <span class="token number">0x010</span> <span class="token punctuation">)</span><span class="token punctuation">;</span>

    <span class="token comment">//接下来就做一些变量的运算，</span>
	<span class="token keyword">int</span> i<span class="token punctuation">,</span>j<span class="token punctuation">;</span>

	<span class="token keyword">for</span><span class="token punctuation">(</span> i<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator">&lt;</span><span class="token number">100</span><span class="token punctuation">;</span> i<span class="token operator">++</span> <span class="token punctuation">)</span>
	<span class="token punctuation">{</span>
		<span class="token comment">//int j;</span>
		<span class="token keyword">for</span><span class="token punctuation">(</span> j<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">;</span> j<span class="token operator">&lt;</span><span class="token number">100</span><span class="token punctuation">;</span> j<span class="token operator">++</span><span class="token punctuation">,</span>p<span class="token operator">++</span> <span class="token punctuation">)</span>
		<span class="token punctuation">{</span>
			<span class="token operator">*</span>p<span class="token operator">=</span>i<span class="token operator">*</span><span class="token number">100</span><span class="token operator">+</span><span class="token punctuation">(</span>j<span class="token operator">+</span><span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		<span class="token punctuation">}</span>
	<span class="token punctuation">}</span>
	<span class="token comment">//最后再把这一块：呃打出一段讯息出来就结束了。</span>
	<span class="token function">MessageBoxA</span><span class="token punctuation">(</span> <span class="token constant">NULL</span><span class="token punctuation">,</span> p<span class="token punctuation">,</span> <span class="token string">&quot;abcd&quot;</span><span class="token punctuation">,</span> MB_OK <span class="token punctuation">)</span><span class="token punctuation">;</span>

	<span class="token keyword">return</span> <span class="token number">0</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br></div></div><p>我们再往下看，现在刚刚那个画面已经让我们知道了，如果我有能力写出一个这种启动码「startup code」的话，我在那个整合环境底下可以去设定它啊。</p> <p>好，那现在我就试着来写一个看看。这个是在windows底下，我写了一个函数叫做MyStartup啊。
好，它的参数、它的返回型类型都必须吻合上一页这里所说的这一些条件。哼好，再回到这里来，然后在这个地方，由于，你要写一个泛用型的是非常困难的，我们现在只是要浅尝即止啊看看如果我写一个出来，我怎么设定。</p> <p>所以我写的这一段里头呢做了什么事情，我们看看。</p> <p>我把我写的这一个方式按照刚刚的设定，上一页这边啊在这一些选项里面去填好它：他在这个地方我就设定了MyStartup，填上去之后，在这个Project Option里头，它自动会出现entry进入点。
我这个C++程序的进入点是什么呢？是main呢？是这个函数启动代码，这样就写好，并且设定好。</p> <p>我没有写main这个函数，很奇怪啊，这整个程序我没有写main，但是他能执行，它比main更早执行起来。
那main到哪里去了呢？</p> <ul><li><font style="background:pink;"><code>main</code>这个function其实是应该由启动代码来调用的</font>，那后面几张图片就会看到了马上就会看到了，而我们呢没有去调用它。</li> <li>好，这是一个非常非常简单的启动了。那当然啦，他如此简单，所以他也没什么用，他不能够作为一个先驱去拉动后面的main，他根本没有调用main，但这是可以执行的。</li></ul> <h3 id="ppt-我们在linux底下写一个「startup-code」"><a href="#ppt-我们在linux底下写一个「startup-code」" class="header-anchor">#</a> PPT.我们在linux底下写一个「startup code」</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210705094739710.png" alt="image-20210705094739710"></p> <p>我们看下一页，刚刚那一页是在windows底下写一个简单的启动嘛，<strong>现在呢我们在linux底下写一个试试看</strong>。
好，这一段就是代码，这是在环境在这个linux环境底下啊：我说我要来写一个叫<code>entrypoint.c</code>，当然<code>.cpp</code>也可以啊。啊点C这样的程序写了两个函数，一个叫<code>blabla()</code>，一个叫<code>main</code>，</p> <ul><li><strong>我要把blabla这个function这个函数呢设为entry point</strong>，呃不是我们以前常常讲的那个main（那个entry point）啊。不是啊，是现在所说的启动码。而blabla里头做什么？
<ul><li>不能做太多事情，不能做太多事情，这里只是输出一个文字而已。</li></ul></li> <li>然后做这个动作就是在这个gcc底下，你可以加上这个<code>option</code>，说我的这整个程序叫M、H，P点C，随便取的名字，可以加上这个action这个选项这个选项这个**-e**，<strong>e就是进入点，就告诉链接器说把我这个blabla这个函数呢当成进入点。</strong></li> <li>好，去编译执行呢，果然把这个blabla执行起来了。所以这整个程序是这两个函数哦。main这个函数根本没有执行起来！</li> <li><font style="background:yellow;">再强调一次这个观念，任何的C或C++程序在面这个函数之前，有一个所谓的启动码函数，<strong>你的main必须由这个启动吗调用起来</strong>，所以这个启动嘛一定是最早执行的函数!!</font></li> <li>我们在刚刚windows底下和现在linux底下都写了一个很简单的启动码函数。**在这个例子里头，我没有去让他把后面的main拉出来，所以main也就没有执行。**而前一页windows底下我们写的这个启动码，我们根本就没有main</li> <li>嗯好，这是两个例子。</li></ul> <h2 id="_02-默认的-startup-code-在哪儿，main-生前和死后的-call"><a href="#_02-默认的-startup-code-在哪儿，main-生前和死后的-call" class="header-anchor">#</a> 02.默认的 <code>Startup code</code> 在哪儿，main 生前和死后的 Call</h2> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210705095508167.png" alt="image-20210705095508167"></p> <ul><li>所以，这这边我们知道了：怎么设定啊，怎么写，虽然写的这东西没有什么用啊，那个太“阳春”了没有什么用。
<ul><li>现在我们要正式进去看看啊，<strong>以windows 环境底下的vc6， 我们先看vc6啊，他所提供的 <code>Startup code</code></strong> 。<strong>呃，真正有作用的这段代码到底在哪里</strong>？</li></ul></li></ul> <p>我后续所给的这些投影片啊，这些讲义以我个人的准备习惯。除非我忽略掉，不然我都会在代码的。呃，也许是左上角，也许是右上角呢写上他的<code>file name</code>（文件名称）方便你自己，也许你也想找找看。</p> <ul><li><p>好，现在 <code>Startup code</code> 在哪里呢？</p> <ul><li>在VC6底下，我们看到这里有四个file。这都是，都是截图。所以你在你的vc6，当然VC6太久的版本的，也许你手上已经没有了哈，不过没有关系。如果你有VC6，你就应该能找到这4个文件名。</li></ul></li> <li><p>这四个，<strong>其中的三个都应了这一个，这三个我线条都拉好了</strong>。<strong>所以真正的启动代码就放在这里了</strong>。
这里面我刚刚提过了，这是揭露这只是前面的一些一些呃文档说明。好在这里头叫<font style="background:pink;"><code>crt0.c</code></font></p></li></ul> <h3 id="ppt-call-stack🚀🚀🚀"><a href="#ppt-call-stack🚀🚀🚀" class="header-anchor">#</a> PPT. <code>call stack</code>🚀🚀🚀</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210705100013939.png" alt="image-20210705100013939"></p> <p>在还没有看这个源代码之前。我在为各位介绍这样的一张图，这在我后面的投影片呢呢，会很频繁的出现。
这个叫<code>call stack</code>，函数调用的次序。<strong>这是用debug调试器去看，但是你所看到的不会是这样的画面！</strong> <strong>这个是我整理过的。</strong></p> <ul><li>这个要怎么看？</li> <li>这是<code>call stack</code> 我的我整理过的，我不是一个<code>Hard copy</code>不是一个硬屏幕截图啊，所以<font style="background:yellow;">我整理的方式是由下往上整理。</font></li></ul> <p>也就是说看这张图呢。</p> <ul><li><code>KERNEL 32! bff89f5b()</code>这个是最早被调用起来的。</li></ul> <p><strong>当我在执行一个程序的时候，我可以观察到谁调用谁，我会用一个缩排的方式，更容易看。</strong></p> <ul><li>倒数第四行这个<code>mainCRTStartup()</code>。就是从刚刚到现在一直在讲的windows 底下的启动代码，这个函数名称！<code>mainCRTStartup()</code> 啊。</li></ul> <p>这里头以我现在整理的缩排的情况啊，我们可以看到！
它往后，在这个图上<strong>往上调用</strong>了这些函数。
<strong>其中某一些函数又往内部就更深一层的在调用了其他的函数。</strong>
这个图是这么看的：<font style="background:yellow;">所以同一个层次的，同一个level 的，我把它画画的对齐。『比如徐框框的9个』</font>
我们从这张图我所要表现，各位看的就是：windows 所提供的这一个启动代码。
<strong>他里头主要调用了9个动作。你看我把他画的是对齐在同一个层次上面</strong>。
其中，第8号，这就是我们一般人认为的c 或C++程序的进入点。
当然这里：刚刚说有一二三三个版本嘛。
这到底是启动哪一个都是有可能的。</p> <p>所以在后面的啊画面中呢，我们会会常常以这种形式来表现这个谁调用谁。</p> <p>比如以这个来看。
他进去的第一个重要动作叫<code>_heap_init()</code>
我在这边表现出来是他内部这个函数内部又调用了这个函数<code>__sbh_heap_init()</code>，但我并不是表示说他只要用这个函数。
它里头可能有很多很多动作，也带来了很多其他的函数。</p> <p>但是就我现在想表现的重要的事情是，我只想讲这一个<code>__sbh_heap_init()</code>，我只关心这个。
所以在看这些图的说，一定要注意。</p> <p>又好比这一个第二个重要动作叫<code>_ioinit()</code>
我这么表现的意思是。在我所关注的一件事情上面，他是一层一层的，不要用进去。然后再一层一层退出来。
这只是某一个我所关注的点上面，他有这种行为。</p> <p>啊，比如说<strong>他也许这个地方要用进去以后，这个地方要退出来，然后又调用了。谁，这都是有可能的。</strong>
在我关注的点上，这个<code>_ioinit()</code>呢做了这些事情。</p> <ul><li><font style="background:yellow;">所以这是一张经过整理的call stack，并不是某一个时刻下的真正的call stack</font></li> <li>这个要注意</li></ul> <h2 id="_03-startup-code源码摘要"><a href="#_03-startup-code源码摘要" class="header-anchor">#</a> 03.<code>Startup code</code>源码摘要</h2> <h3 id="函数maincrtstartup-void"><a href="#函数maincrtstartup-void" class="header-anchor">#</a> 函数<code>mainCRTStartup(void)</code></h3> <p>那我下看。现在要正式进入这个启动代码，它的行为模式了。
在vc6底下。在<code>crt 0.c</code>刚刚说有四个文件，其中三个都include 都含入了这一个。
<font style="background:pink;">这里面有一个函数叫这个名字<code>mainCRTStartup(void)</code>，这就是我们整个课程的主角。</font></p> <ul><li>第1男主角，男一号。</li></ul> <p>好，所以很多东西都被我删截掉了，留下最重要的东西呢就是这里标出了1到9</p> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210705103237922.png" alt="image-20210705103237922"></p> <div class="language-c line-numbers-mode"><pre class="language-c"><code><span class="token keyword">void</span> <span class="token function">mainCRTStartup</span><span class="token punctuation">(</span> <span class="token keyword">void</span> <span class="token punctuation">)</span>
<span class="token punctuation">{</span>
    <span class="token keyword">int</span> mainret<span class="token punctuation">;</span>
    <span class="token comment">//Get the full Win32 version</span>
    _osver <span class="token operator">=</span> <span class="token function">GetVersion</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    _winminor <span class="token operator">=</span> <span class="token punctuation">(</span> _osver<span class="token operator">&gt;&gt;</span><span class="token number">8</span> <span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0x00FF</span> <span class="token punctuation">;</span>
    _winmajor <span class="token operator">=</span> <span class="token punctuation">(</span> _winmajor<span class="token operator">&lt;&lt;</span><span class="token number">8</span> <span class="token punctuation">)</span> <span class="token operator">+</span> _winminor<span class="token punctuation">;</span>
    _osver <span class="token operator">=</span> <span class="token punctuation">(</span> _osver<span class="token operator">&gt;&gt;</span><span class="token number">16</span> <span class="token punctuation">)</span> <span class="token operator">&amp;</span> <span class="token number">0x00FFFF</span><span class="token punctuation">;</span>
    
    <span class="token keyword">if</span><span class="token punctuation">(</span> <span class="token operator">!</span> <span class="token function">_heap_init</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">)</span>	<span class="token comment">/* initialize heap */</span>
        <span class="token function">fast_error_exit</span><span class="token punctuation">(</span> _RT_HEAPINIT <span class="token punctuation">)</span><span class="token punctuation">;</span>	<span class="token comment">/* write message and die */</span>
    <span class="token comment">/*
     * Guard
}
</span></code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br></div></div><ul><li>我们可以说这个是在调试器之下观察的结果！而这一页这个是他的源代码『有删除』。那当然要一一对应，不然就奇怪了。在这个启动代码的这一些重要动作的<strong>第8还是第9呢？我来看看这个——第8，才进入应用程序员所写的main</strong></li> <li>所以在整个课程一开始，我说我把他站起来命名这个课叫做c++的。生前死后，生前就是**进入main之前做了这么多动作。**此后呢main结束之后还做了一些动作。</li> <li>好，其中的3-6又被我用一个有颜色的线框起来，我们来看看它的名称啊！我们可以用这张图啊，大略感受一下到底启动代码做了什么事啊，在进入8号之前main之前做了些什么事？
<ul><li>第1个<strong>Heap的初始化</strong>。任何一个程序几乎免不了要用到内存。所以他一开始要对内存做一些初始化动作哈，可以理解。但是目前还不知道他做了什么初始化。</li> <li>第2个<strong>io的初始化</strong>，几乎任何一个C或者C++程序也都需要IO，IO，包括printf，C这个层次，包括C++的cout 这种东西。。</li></ul></li> <li>怎么样做初始化？3-6，顾名思义看看呢。<code>GetCommandLineA()</code>和<code>crtGetEnvironmentStringA()</code> 环境变量。还没来。命令行参数。that a r, g, v set in one.</li></ul> <p><strong>看起来3-6。都是在做字符串的处理。字符串的处理是一件不是太值得讲的事情！</strong>
但是我们可以很刚好很很好的啊，有这么一个机会来看看他处理的哪些字符串。因而<strong>反推回来他需要多少内存</strong>。
然后去印证我们对于内存Heap初始化的理解。</p> <ul><li><p>所以3-6本来是一些minner（次要的），很琐碎的动作。但是他反而带来这个价值，让我们去验证对内存的理解。</p></li> <li><p><font style="background:pink;">第7</font>去这个地方，大家很关注是8字进入main嘛，所以刚才已经进讲到了6了。那么7就也就是说在进入main之前有一个另外一个初始化，你看啊。这里有初始化。这里io 有出色啊，那怎么到了七呢？C也有一个初始化<code>cinit()</code>。这个很奇怪，这个到底在做什么事情？好，这当然这都是我们后面要探讨的。</p></li> <li><p>然后终于进入我们写的main()，他终于被应用程序员的代码接管。</p></li> <li><p>下面，这个exit 里头也做了很多的事情。</p></li></ul> <p>这就是我要带大家去看的整个课程这个启动代码的主要酒的动作。</p> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210705104143896.png" alt="image-20210705104143896"></p> <p>好，刚刚提到这一个。其实是整理后的结果。
里头实际上是有很多的<code>ifdef</code>。这一个条件判断。
我们来看看下面这一页，<strong>它里头其实长相是类似这样，也许这一段也是一个截录啊，我也不能够记得太清楚</strong>。
也许有一些又被我拿掉了，但是在这个地方我要表现的是它里面很多的条件编译。</p> <p>那如果不是这一种情况，而是进入到这种情况的话，那么他们代码阿里头饰<code>WinMain</code>。或者是main。
所以这一段代码要告诉大家，他真正的整份有很多的条件，编译要来对应前面。我在这一页。这一页所说的，他其实有3个版本。好，回到刚刚这个地方来。
这样子我们对于所谓windows 平台下的启动代码，它的结构有点了解了。
啊，它里面主要做9个动作。</p> <h3 id="c-的生前-时后具体代码对应1-7和9"><a href="#c-的生前-时后具体代码对应1-7和9" class="header-anchor">#</a> C++的生前+时后具体代码对应1-7和9</h3> <ul><li>接下来我们就一个一个来看。</li></ul> <p>我们复习一下，我们现在学到了什么东西。</p> <ul><li><p>第一个。
有所谓比启动代码里面更早。</p></li> <li><p>第二个。
在格式上，我们有能力写出启动代码，只要一个函数名称，他遵照一定的调用调用的习惯。呃，他的参数呃，怎么样安排按照一定的方式去安排就可以了。</p></li> <li><p>第三个我们可以去把这个函数设定到的整个的平台上。
我们现在的平台是VC</p></li> <li><p>第四个<font style="background:pink;">我们刚刚<strong>其实已经看到了真正的启动代码所做的事情</strong>，我把它分为9个重要动作</font>，其中到了第8个才终于进入C++程序员应用程序员所写的man。</p></li> <li><p><font style="background:yellow;"><strong>所以前面的1-7等于说是main的生前</strong>。进入8,然后8结束之后，他进入9，这个9就是C++程序的，死后。</font></p></li></ul> <p>嗯，刚刚最后是尽请到这1页啊，这一块这一段没有讲什么：</p> <p>补起来。
刚刚有提到这个在启动代码的，他的形式呢可以有很多的一份define，所以会其实其实是可以对应到三个版本。这里有console文字模式的版本。
这里有就进入这个。
WinMain 这种版本，还有<code>dllMain</code> 的那个版本呢，我们要写出来，这只是结论。</p> <p>那另外可能你这个会看到这种。</p> <ul><li><code>tWinMain()</code>这种东西啊，这个跟我们现在要讲的主题无关。不过你有可能看到是，所以呢还是提一下，像这种呢是要在<strong>应付Unicode</strong>。</li></ul> <p>好，这个是题外话。</p> <h2 id="_04-heap-init-startup的首要工程（上）🚀✔️"><a href="#_04-heap-init-startup的首要工程（上）🚀✔️" class="header-anchor">#</a> 04. <code>heap init Startup</code>的首要工程（上）🚀✔️</h2> <h3 id="ppt-sbh-small-block-heap"><a href="#ppt-sbh-small-block-heap" class="header-anchor">#</a> PPT.<code>SBH</code>:Small Block Heap</h3> <p>嗯。接下来我要引导你的就是。
这一个启动代码，我们一直说第八个是这个main嘛，我所归我所我所分的九个动作里面，第八个层面。
那前面七个我们要一个一个看啊,第1个。这就是__heap_init(...) 跟内存有关。</p> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211125092917.png" alt="image-20211125092914402"></p> <ul><li>对这个主题呢我有一点点，所以我有一点点为难。我要说的话，我把它写在这里了，我们看看。在我的另外一门课叫《C++内存管理机制》。他这里头总共五讲，这是一个比较大的题目。这里面的第三讲就谈到了malloc 跟free。这里头对于现在我在这个课程要引导你看这initialization 的<strong>内容是相同</strong>的相同的。「对照」</li> <li>那但是我又不能说呃，好，这边一前某一个课程讲过了，大家去看那个课程吧这样子。这门口这里又不齐全了。</li> <li>所以所以我还是要在这个地方呢把这一部分讲清楚。但是是和这一门课的第三讲，它是主题是相同的。这个我必须先声明。但另外一个不同的地方，就是<strong>毕竟那门课专门在讲内存，是讲的非常的详细</strong>。而我们这里呢。不需要那么详细，所以有一些东西我是简化了。那这个简化并不影响我们这个整个在这里这个主题的设计。</li></ul> <p>第二个特点是。前面我有提过，我会带大家看vc10，你看这个是vc6。vc10在这一部分这里的，第一个部分__heap__init(...)有一个重大的变化。也就是说我们在vc6里面学到的一些很深入的东西。到VC10不见了。</p> <p>那是有所更改，还是有所长进，还是怎么样呢？</p> <ul><li>哦，其实那些东西全部都在，只是到了vc10呢，==它搬到操作系统层面去了==。</li></ul> <p>而我们很幸运的有这个旧的版本可以看，因为你这个crt。整个vc 里面的这个crtc 一部分，它是以源代码呈现的。至少我们可以看到源代码。</p> <p>那么到了vc10，他就这一部分不见了呢。我们我会带大家看。<strong>挖出，作业系统层面的啊的一些证据</strong>来告诉你说那些东西还在。但是没有源代码了。操作系统层面没有源代码了。</p> <ul><li><p>你上网也也许可以找到windows 的源代码，但是第<strong>一个呃真假莫辨</strong>，第<strong>二个也很难看啊</strong>。</p></li> <li><p>所以。这个基础还是非常好的。我们从vc 六开始看到源代码。然后再看看它的变化。
好，这是我先对于这个主题我们的启动码。第一个重要动作的一些说明。</p></li> <li><p>就是启动嘛，首先做了这个初始化动作。这个初始化动作里面的一个重要动作加s b h heap initialization。
==SBH后面可能会再出现==，所以大家要把它记下来就叫==small block heap==小区块的管理。</p></li> <li><p>什么叫做小？这个不同的平台上面，不同的小系统对于小的定义都不同。</p></li> <li><p>我马上带你看看他这里的小是多小。</p></li> <li><p>我们再回到左手边来，继续看，这里只是作为一个初始化的动作。
然后启动码就进入第二个重要动作叫i o i n i t。</p></li> <li><p>这里面的动作呢，我抓出，我现在关注的都是跟内存有关的。各位看一层一层的下去都是在做内存分配有关的事情。
我目前只注意只关注这个事情，所以我给你这张图。</p> <p>在这里。由于i o i n i t 它需要分配内存，所以才会引导的这些动作。</p></li> <li><p>其中这一个动作(heap_alloc_base(...))。这些函数名称没有人记得下来啊，我看的时候也是看着一头雾水。我们不需要去寄名称。 我现在标出来这一个函数(heap_alloc_base(...))，这个地方。他的源代码片段在这里。
这个片段上面说，如果要的大小小于绿色这一块的话，这个叫three witch hold 就是一个门槛。如果小于这个门槛就做什么事呢？看起来就是从s b eh s bh 它设计的另外一块小系统去拿内存</p></li> <li><p>如果你要，<strong>你：客户</strong>啊所要的区块小于门槛，我有一个特殊设计。一个比较好的管理，现在的<strong>我就是指启动代码</strong>。如果大于这个门槛。我就不管了。我就让操作系统来为你。</p></li> <li><p>我不要在中间再加上一层服务，这就是这两段的。
而这个门槛是多大呢？这是一个常量。去查一下他是3f8，换算成十进位就是1016</p> <p><strong>这是一个奇怪的数字啊</strong>，我们要不叫256，五五一二幺一零二四怎么弄出一个一零一六呢？</p> <p>其实是因为这个大小在这个过程之中，你看这里有这么多的过程。那这个过程之中呢他不断的在变化。他会膨胀。</p></li> <li><p>所以我现在马上要告诉你。其实在整个系统就这个启动代码所设计的这个所谓的s b h。</p></li> <li><p>等他设定完成之后，他就是要应付c r t 本身==以及你这个main进去之后==，的所有的内存分配。要由他来应付。</p></li> <li><p>他是怎么应付你的呢？好，我们看这张图。「最右边」
这结论先告诉你就是。
你所要的区块是这个浅绿色的。会被他。他是谁？启动代码的这个heap的初始化的是整个什么sdh的整个体系。被他包装成这么一大块。</p></li> <li><p>浅绿色是你要的。一客户啊应用程序所要的上面会包装了8格，一二三四五六七八。每一格我画的是四个字节啊。下面还有一格，总共九个。包装完。之后还要再加上上下这个砖头色（红色）的两格，这个叫cookie。</p></li> <li><p>加完了之后还要调到十六的边界。为什么要调到十六边界后面再来说？（对齐）</p></li> <li><p>所以。呃，当然这有个前提哈。上面加八格以及下面加一格，==这个是调试模式底下才会做==的。</p> <ul><li>如果非调试模式，就不会有这九格。</li></ul></li></ul> <h3 id="调试模式"><a href="#调试模式" class="header-anchor">#</a> 调试模式</h3> <ul><li><strong>那么从现在开始，我们讲的我们都以调试模式啊作为一个基准。</strong></li> <li>我就不会再常常去强调它。</li> <li>特别是后面我们要观察一些内存的长度，一定要用调试器去看。那当然是进入调试模式。</li> <li>好，现在回到这里来啊，所以马上建立一个观念。
你的C++程序在调试模式底下，其实每一块你所拿到的每一块内存长这个样子。「指着右边的图」
这个地方说，如果小于门槛1016，为什么设为一零一六呢？是因为在一次一次的调用过程啊。用到这里的时候到这里的时候还没有加上这个上下。cookies，那这个加起来是八呀。所以等他继续进去之后，他还要再加八。所以这个一零一六加八十一零二十四。‘</li></ul> <h3 id="小区块"><a href="#小区块" class="header-anchor">#</a> 小区块</h3> <ul><li>所以==其实他的门槛就是一整块==，==什么叫做小区块呢？==
<ul><li>一零二四就是1K「指着右边的图」</li></ul></li> <li>整理一下经过这一个这个调整之后，凡是小于等于1k 的，他认为够小。他要用一个特殊成所谓的sbh去服务他去管理他。大于1K的那就是算是。比较大。他不打算插手了。他就让作业锡，操作系统来哎，满足你满足客户。这就是这一段代码我所要解释的。、</li> <li>这个系heap的观念。我要谈一谈呢。在操作系统。在任何。不管是哪一个层面上面啊，==对于heap的理解都是好像。==，==一个池塘==，一堆的内存，我们叫做heap。</li> <li>windows 本身它本来就提供了，两个层次，一个比较低接一个比较高阶的heap的管理。
地阶的那一个叫做virtual allocat，叫做virtual heap
比较高阶一点的就是这个叫==HeapAllo（指着正下方的代码说）==</li></ul> <p>你可以这样想象。我可以向操作系统，我指的是windows，要求a 这么一大块池塘。B这么一大块c 这么一大块，他们的大小呢，我可以我可以设定啊，我也可以不管他，反正他有默认值。</p> <p>我给他命名a b c 或d 或e 或f 好，我们命名了这些之后呢。他们我这个a 我自己命名叫a 或b 或c 他就意思是说他就他专门的用途。嗯，我现在可能一下子想不起来怎么去解释他啊呃。</p> <p>呃。好，
比如说。我要某一种用途的，我都从a 这一大块来拿啊，我要另外一种用途的，我都从b 这边来拿。这就是windows 所提供的HeapAlloc的作用，这个功能非常好。按理说已经够了。</p> <ul><li>==只不过在VC6的crt 里面==，在这个之上又涨了一个<strong>对于特别小的这一他的一个特殊的管理</strong>。这个是SBH</li></ul> <p>好，所以。
对于这一页的总结就是。</p> <p>这里有分大或小，而决定有两种不同的对付方式。</p> <h3 id="vc10不见的vc6"><a href="#vc10不见的vc6" class="header-anchor">#</a> VC10不见的VC6</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211125101259.png" alt="image-20211125101257472"></p> <p>但是我们看下一页，这是vc 六哦。
v c 十。的启动代码。
这个地方都不见了。打叉。盖住的地方都不见。如果你细心去比对。啊，你你当然需要了，这个讲义都在你手上，你比对这一页旱上一页。你会发现不见了。都是和SBH有关的，我们从函数名称就可以看出来嘛，你看这三个啊这三个字，s b a h 开头。我们看下一页，这三个都不见了。</p> <p>换句话说，在vc10它不再去管什么叫做比较大，大于1k 什么叫比较小小于e k 他不再管这个事情了。
他没有特殊设计的那我们看。这里面所有的内存分配。</p> <p>最后都是最终。就是这就是最底层的这个函数叫做：heap_alloc_base。我刚刚讲过函数名称无所谓。谁也背不下来，但这个函数现在我引导你去看他的源代码。好。这一个函数啊。
沿着我画的这个线条到这里来。heap_alloc_base其实就换了一个名称叫__heap_alloc_
而__heap_alloc_在这里。
好，这里头做什么事情呢？</p> <p>刚刚在vc 六这个地方，我带你这样看，他会去检查有没有小于门槛。
现在在==vc 10==啊，我们再这样子走一遍，在这里他们不再检查是不是小于那个门槛呢？</p> <p>不==管多大，不管博小，他通通交给操作系统的HeapAlloc去服务==。</p> <ul><li>这就是六和十的差别。</li> <li>可是我们接下去要讲的是6下面的这个SBH，它里面有精巧设计，我们接下去都要讲这一个。
现在你却告诉我10，他都。这样学那些还有意义吗？</li> <li>我要告诉你。那些只是在crt 就这一个源代码层面不见了，他其实就是被包到这里来了，这里。操作系统来了。
<strong>我怎么敢讲这句话呢？我用手上也没有操作系统的源代码</strong>。==对，不是再用源代码来来表现的，在后面我就会特别辟出一个小单元告诉你。==</li> <li>这一个函数的行为。啊，那个时候你就会恍然大悟啊。他的行为和我们在vc 六的这个SBH行为完全一样。</li> <li>好，所以先透过这两页。这个引导让大家知道。旧版和新版的变化。好，注意这这个地方啊。
所有内存管理机制其实仍然存在，只不过深埋到OS层面去了。</li> <li>注意这里。
好，再往下。</li></ul> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211125102834.png" alt="image-20211125102727748"></p> <h3 id="第3ppt"><a href="#第3ppt" class="header-anchor">#</a> 第3PPT</h3> <ul><li>所以我们还是以啊，很安心的在VC6底下去看看他所谓的小区块，他是怎么管理的。</li> <li>要进入这一页，这一页是是哪里呀？我们在回头看一下你所希望你永远记住这边有call stack</li> <li>啊，我现在要带你看的就是初始化里面的一个。我们现在最关注的动作就这一个__sbh_heap_init()</li></ul> <p>首先做这件事情。刚刚我有提过，我们可以跟操作系统说，我给我一块池塘加a 给我另外一个池塘叫b。好，现在就是这样，请你给我一块池塘。（HeapCreate）啊，就系统给我一个。名字叫绿色的这个东西。</p> <ul><li>顾名思义，这一整块池塘是为crt 而准备的。多大呢？4096，这个值无所谓，因为以后可以弹性增长，这只是一开始的词，无所谓。我现在要做初始化动作哦，我是启动代码啊，启动玛我要做初始化工作。我设好了这个池塘之后。
<strong>我要在这个池塘里面开始设一些我需要的结构，用来管小区块</strong>整个动作包在这一个函数之中（__sbh_heap_init()）</li> <li>这个函数里面做什么事情？就从这。一个池塘里头，你看这个词，他名字叫crtheap</li></ul> <p>从这个池塘之中啊，我说操作系统，请你从这个池塘里面给我给我什么呢？==十六个HEADER。HEADER是什么==？现在先不必管它，十六个在这里。</p> <p>同时我把一些状态设好，这些状态现在也无关紧要啊，==我们在我刚刚提过在内存管理那门课里面就会对这个讲的比较多==。现在这边呢无关紧要，把这个十六个HEADER。挖出了十六个HEADER的准备，等下要用。</p> <h3 id="_16个header长相"><a href="#_16个header长相" class="header-anchor">#</a> 16个HEADER长相</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211125102847.png" alt="image-20211125102804607"></p> <p>这个黑的到底长什么样子呢？他其实长这样。这是他的结构。这里是黑的。</p> <p>嗯。我是一个擅长画图的。啊，我自认为，所以把这个数据结构呢化成图就一目了然了。</p> <p>啊，我我引导你看怎么样看这个图啊。这一个结构里面有五个东西。电量在这里，红色的这两个看起来是指针嘛。
所以我就画了两根指针。扣除了这两个
另外是三个东西，他们这三个东西是什么东西呢？是紫色的这个。这个是什么定义？在上头昂山integer 也就是三十二个int 三十二个way。</p> <p>啊，<strong>我现在的电脑是32位的电脑啊</strong>，所以这是on 三应急，就是三十二个。</p> <p>我就按照这种方式把它画出来，两根指针。加上这三个栏目。
不过请注意，我这边特别的害，跟漏的地方用的不同的人用绿色。
<strong>是要提醒你，他整个设计其实是把这个Hi和这个Lo。拼凑在一起。</strong>
也就是三十二位的氦和三十二倍的路变成加起来变成一个六十四位的东西。所以这一条就是六十四位。</p> <p>那我怎么都没有看到他有什么。什么好的，什么管理小区块的那些精密的设计呢？
看不出来啊。那些动作，那些结构。要等到真正客户。要求的一块内存，那些结构才会长出来。</p> <p>因为下下一页就有我现在所需要的东西。这个call stack</p> <p>所以我们已经进行了这个启动代码。
第一个初始化动作做的事情很简单，十六个头好像也看不出他的作用。</p> <ul><li>==接下来的第二个重要动作是io 的初始化。==
<ul><li>==其中有分配内存==，但io 它本身也有一大堆，那个是下一个主题。还有要做的事情。</li> <li>但是他在做这些事情的过程中啊，要了一块内存。</li></ul></li></ul> <p>==<strong>就在那一个点上。我往深入进去观察，我们才可以看出来他这个header。刚刚你回到上一页，这个header的会长成什么样子</strong>==。</p> <h2 id="_05-内存分配精解（一）"><a href="#_05-内存分配精解（一）" class="header-anchor">#</a> 05.内存分配精解（一）</h2> <div class="language-txt line-numbers-mode"><pre class="language-text"><code>啊。
好，刚刚我们谈到。
一个黑的长什么样子？
前面有一张投影片的一个小角落，刚刚没有提到。
我们回到前面这个地方来。
vc 六的线。
初始化动作。这一夜里头这一块。
我其实想引导大家去清楚的认识到内存块。由于我们现在这个。
启动嘛第一个动作就跟内存有关的啊，这个内存块第一个从哪里来？第二个大小是怎么计算的。第三个他回抽到什么地方去。
是从哪里来呢？刚才已经告诉你了。
如果算出来最后小于一k 那么就由sb hh 来提供，这是从哪里来？但如果大于一k。
由操作系统那些池塘来提供。
第二个。
一一k 这个整个区块到底是怎么计算的啊，这个刚刚也有提过了，我们会。
我在调试模式下会膨胀等等等。
啊，注意，这是刚刚没有特别提出来谈的一二三至至于三回收到何处呢？这是更后面的话题。
好，继续往下看，刚刚进行到这个黑的是长这个样子。
我们再往下。
这个已经讲完了一。
里面做sba h 的初始化讲完了就是十六个黑的。
然后。
进入二i o i n i t 它的源代码在这边。
被我删截掉了。非常多的东西。
我三截掉了都是跟i o 有关的，因为这是后面的主题，我们现在只专注在内存。
在这个这是个这个函数非常大。
里头跟内存相关的就是这样。
我们来看看。
他要分配。
一段大小。
这个常量是三十二。
这个size of 吧，io information 跟i o 有关的，看起来它是要配分配出三十二个这种东西，这种东西多大呢？把它加一加。
在调整一下是八个字节。
long 四个字节，char 一个一个四加一加一是六六，要调到三十二位的边界呢是八个字节。
所以在这个动作需要的是三十二乘以八。
哎，这个函数比较陌生，他其实是什么？
群的箭头往上看。
这里有一个define。
这一个函数。
相当于这样。
所以这不是一个，你说这是函数嘛，这是一个红这是一个红。
所以这一个动作三十二乘以八，也就是这里的。
那是两百五十六。
啊，这个就是要分配两百五十六个字节，并且加上一些参数。
这个我解释一下，绿色这一部分就是一家家的编译器都会提供的。
呃，你把它叫洪好了。mico. 
这样就可以设定出做这个动作的时候，他是在哪一个fire 里头等拿第几行这个line 第几行？
就会被登记起来。所以你可以很显然这是在调试模式底下要用的。
我们另外一般很熟悉的是这个啦ml。
没老哥。
再看一眼就是这个东西如果在。
非调试模式家，那就是一般的分配内存。如果在调试模式下就是分配内存，并且登记一些性喜。
这是这个函数的作用。
我们刚已经算不过了两百五十六。
所以。
在进入面之前。
我们能够我们应用程序。
应用程序员各显神通的部分都是man。
啊，看你要怎么写，前面这一段都是不能改的是。
启动了。
所以任何一个程序，任何一个c 加加程序的第一次分配的内存大小。
永远是。
两百五十六。
做什么用？
i o 初始化的时候要用。
这个两百五十六就是这张图和一零零h。
很快的头脑换算一下，一零零十六进位，那就是两百五十六。
那么在由于这是调试模式，所以要加上上下这些东西。
再加上上下这些东西。
加完以后的这个长度要登记在库体之中，就是这个砖头色的这个地方，我们来接着看。
这是一零零h。
加上上上面上下加起来是三十六。
一二三四五六七八加这个。
九。
九四三十六也就是二十四h。
加完之后再加上上下苦尽。
八个。
加完之后把它加总起来是多少？一二四h。
一二c。
啊，一二c 要调到十六的边界。
就是一三零。
我怎么算的那么快呢？其实十六进位就有这个好处啊，你要调到十六的边界，后面那个值一定是哪的？
所以e 二s e 往上调。
那就是一三年。
哎，一从一月二十一到一三零，这中间多了四个字节，怎么没有画出来呢？
我来看看。
呃，这张图还真是画错了。
这个地方还应该再多画一小块四个自己。
表示是填补的内容，填补的一段四个自己的空间。
这里应该要加上去才是最精准。
好，所以io 初始化的时候，他在要要要求两百五十六个字节。
会在这个一个一个的过程之中。
好呃，某一个函数会膨胀一点。我另外一个函数又会加固体，在另外一个函数还会调到使用的边界，最后得到了。
这样的结果整块是一三零h 这么大。
不过。
客户这里的客户就是i o i n i t 其实要的只是浅绿色这一块，就是这里的二五六。
这一块而已。
所以说他获得的指针p i o。
将会指向这里。
其他都是管理的时候要用的。
谁在管理呢？
信。
或者所谓的s b h。
啊，小区块管理器管理的时候，额外的细节。
好，那么这边。
其他的这些信息告诉大家。
刚刚这一个函数被转为这一个函数，加上这一些是什么呢？像这一个叫crd。
bug 就是二号二号会被停在这个位置上，现在哪一个位置填什么也记不下来啊。但是我告诉你，其实就是填在这里。
好，来表明这一块的用途是给施压利用的。
我们一般啊我们进入面之后，我们所拿的这一些内存块就不会是这一种号码。
我们那时候拿的都是这种normal black。这边会登记为一的这个地方。
好，所以这样我们就知道了啊，这些会流经这一些函数。
溶胀成这个样子。
至于这个算出来是一三零ah，这里怎么是一三一呢？
因为他要利用最后一个bit 来登记一个状态。什么状态就是这一块给出去了。
这件事情后面我还会讲得更详细。所以这个一三一。
其实真正表示这一整块是一三零h。
后面的这几张投影片只是更细雾。
把一些证据或者一些一些数据结构展现出来。他的精神呢在刚刚已经讲完了啊，我们继续看这里还准备了一些什么东西。
我要上夜。刚刚在谈的是这个i o i n i t。那么调用进去之后。
我现在要谈的是这一个函数。
这一个函数里头就是在扩充这个第八个header。
这个第八个黑的长什么样子？各位看啊这个函数到这里来，它的大小。
他传进来的这个大小加已经被他加上了这个大小。
这一个就是这个。
叫做第八叫做。
不拉黑的。
不拉黑的。
这一个大小浅绿色这个大小。
加上这一块。
等一下我们仔细来看看这里头有什么以下八项，一到八，各位看一二三四五六七啊。
加完之后还要在加这个东西。
这个东西是多少呢？
n, no man than five 四。
四就是下面这个词。
所以当他的debug 模式底下套上这些东西，就是说它的套法是比较特别的。前面八格。
后面一。
加起来总共要套九格四九三十六个字节。
好，这八个。
项目八个栏目，把坏东西的意义都已经展现在这里了。
前面两个是指针，因为这些东西要串起来的。
第三个是发热量，也是指针。
指向一个字符串，代表法院呢。
比如说刚刚我们看到i o i n i t 由于这一个动作他发出的需求。
他发出的需求啊，在这边就会指定他的发name 是什么？
发的是什么？就是i o i n i t 嘛。
这是防汛name，但是他放在。
i, o i n i t 点c 里头。
这是这个。
那是第几行呢？我们这里看不出来，其实这一个宏可以展开来。第八十一行。
所以我们在看这里二十一号。
这些都是给调试器。
调试的时候用的。
好。
后头都是一些呃其他的信息。
好，我们再往下看。
这一在再看一次商业这一块东西，从这个地方你可以看出每一块呀。
套上这一些头以及尾。
泡完之后就真的去从s b h y 一块了。
这个函数。
就是他的下一层函数。
下一层我这从下往上啊，所以要往上看。
我当我们在看这个函数的时候，这里做了这些事情的其中里头调用的这一个动作，也就是我标出来的下一个动作。
取得这一块说下面去下夜，注意这个地方。续下叶。
诚上叶，所以接下去还做这些事情。
这些事情。
我也不带你看了。
已经把图画出来。
就是在debug 模式底下的每一块内存，其实都会经过这些动作，他们就会被串接起来。
所以我们到这个地方呢呃应该要形成一个观念了。
客户。
信保的客户，我们现在螃蟹。
他的客户可能是crt 本身。
可能是应用程序啊，反正只要是药内存的人都叫客户跟他要内存的时候。
如果是小于一k。
这个区块将会被膨胀。
那怎么膨胀，刚才已经讲过了。
红钻完之后会真的去挖。
从哪里挖挖？
那个还没提。
刚刚在代码里面有出现，从这里挖。
这种挖出来之后呢，这个恤夏烨这个动作。
看出来被串起来。
所以每一个在调试模式之下的区块都会被串起来。即使他已经给了客户。
客户客户将会得到一根指针指向撤离。
或者指向这里或者指向这里。
但是客户。
不知道。
他们之间其实有着这样的观点。
被串起来了。
也就是每一块都掌握在调试器手中。
调试器为什么能够做那么一些很很特别的。
追踪的动作就是因为其实全部在他手中。
这个地方的代码我就不断你细看了。
你可以看回去慢慢体会，你可以看得出来有指针的设定。所以这就是在牵动这个双向链表。
在windows 的文档里面呢，对于这种东西有一个名字叫做第八个县。
啊，你一看他性本，你可能会去联想啊，我们前面有讲了讲了。
出现了好几次的性子，但这里的第二个系统的意义只在于它就是这些区块串接起来的一个双向链表。
就叫第八个him。
另外下面这些动作我刚刚也没有带着你细看啊，这个这些也无所谓。
但是简单要提的就是这个地方在设定。
客户所要的内存，他给你的时候，这一段代码给出去的时候是会给一些粗直的。
这厨子有哪一些呢？你看。no many land feel. 设为fd。
在land and feel 设为dd。
clay and feel 设为c d。
也就是这一块呃，是被清过的呢，还是已经是在处于一种死亡状态，当然是死亡状态是什么？我们现在。
也不在乎啊，也不必去探讨，就是他在不同的状态都会被这些代码设一些特定的值。
啊，这也是调试器可以拿来检查的。
所以。
我们继续往下看。
又回到了这一个这个先前出现过。
当时我在谈到。
门槛太大或太小，就是执行执行执行了这个函数的时候，他会去检查，因为他该加的都加上去了，所以他实现了这个函数，它会去检查。
这是大宇门槛还是小于门槛？
从。
从而决定这一块。
要从哪里取得？
两个来源，一个就是从s b h 这边去拿一个就是从操作系统的那些池塘去拿。
取决于他到底是大于一k 还是小于一k。
都确定好了之后，接下来所做的事情真的要去拿了。这时候我们会看到出现一些名。
新的字眼叫region，一个叫group。
这就是如果他是小于一k 的话，他要从sdh 这里去拿。
这时候我们终于会怕起到所谓sdh 是怎么。
以这些小于一k 的区块，刚刚只是在算这个大小。
啊，并且设定这些值。
现在终于要去拿这一块了。
哎，那你可能会有一个，这这中间不是有个语病吗？你说这只是在设一些值，然后才要去拿。
你还没有拿你怎么设值？
注意前面这里。
执行到这一个函数的时候。
这边先膨胀大小决定要多大。
然后去拿。
这个拿了动作就可能深入进去了。
是进去之后退出来去呃return，而不是这边进入这个函数，完成之后再返回。
然后去下夜才开始设置。
所以并没有。
并没有矛盾啊没有没有冲突。
所以下面的一个大主题就是。
到哪里去拿这一块已经决定了这个大小。
好，这是下一个大主题。

</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br><span class="line-number">71</span><br><span class="line-number">72</span><br><span class="line-number">73</span><br><span class="line-number">74</span><br><span class="line-number">75</span><br><span class="line-number">76</span><br><span class="line-number">77</span><br><span class="line-number">78</span><br><span class="line-number">79</span><br><span class="line-number">80</span><br><span class="line-number">81</span><br><span class="line-number">82</span><br><span class="line-number">83</span><br><span class="line-number">84</span><br><span class="line-number">85</span><br><span class="line-number">86</span><br><span class="line-number">87</span><br><span class="line-number">88</span><br><span class="line-number">89</span><br><span class="line-number">90</span><br><span class="line-number">91</span><br><span class="line-number">92</span><br><span class="line-number">93</span><br><span class="line-number">94</span><br><span class="line-number">95</span><br><span class="line-number">96</span><br><span class="line-number">97</span><br><span class="line-number">98</span><br><span class="line-number">99</span><br><span class="line-number">100</span><br><span class="line-number">101</span><br><span class="line-number">102</span><br><span class="line-number">103</span><br><span class="line-number">104</span><br><span class="line-number">105</span><br><span class="line-number">106</span><br><span class="line-number">107</span><br><span class="line-number">108</span><br><span class="line-number">109</span><br><span class="line-number">110</span><br><span class="line-number">111</span><br><span class="line-number">112</span><br><span class="line-number">113</span><br><span class="line-number">114</span><br><span class="line-number">115</span><br><span class="line-number">116</span><br><span class="line-number">117</span><br><span class="line-number">118</span><br><span class="line-number">119</span><br><span class="line-number">120</span><br><span class="line-number">121</span><br><span class="line-number">122</span><br><span class="line-number">123</span><br><span class="line-number">124</span><br><span class="line-number">125</span><br><span class="line-number">126</span><br><span class="line-number">127</span><br><span class="line-number">128</span><br><span class="line-number">129</span><br><span class="line-number">130</span><br><span class="line-number">131</span><br><span class="line-number">132</span><br><span class="line-number">133</span><br><span class="line-number">134</span><br><span class="line-number">135</span><br><span class="line-number">136</span><br><span class="line-number">137</span><br><span class="line-number">138</span><br><span class="line-number">139</span><br><span class="line-number">140</span><br><span class="line-number">141</span><br><span class="line-number">142</span><br><span class="line-number">143</span><br><span class="line-number">144</span><br><span class="line-number">145</span><br><span class="line-number">146</span><br><span class="line-number">147</span><br><span class="line-number">148</span><br><span class="line-number">149</span><br><span class="line-number">150</span><br><span class="line-number">151</span><br><span class="line-number">152</span><br><span class="line-number">153</span><br><span class="line-number">154</span><br><span class="line-number">155</span><br><span class="line-number">156</span><br><span class="line-number">157</span><br><span class="line-number">158</span><br><span class="line-number">159</span><br><span class="line-number">160</span><br><span class="line-number">161</span><br><span class="line-number">162</span><br><span class="line-number">163</span><br><span class="line-number">164</span><br><span class="line-number">165</span><br><span class="line-number">166</span><br><span class="line-number">167</span><br><span class="line-number">168</span><br><span class="line-number">169</span><br><span class="line-number">170</span><br><span class="line-number">171</span><br><span class="line-number">172</span><br><span class="line-number">173</span><br><span class="line-number">174</span><br><span class="line-number">175</span><br><span class="line-number">176</span><br><span class="line-number">177</span><br><span class="line-number">178</span><br><span class="line-number">179</span><br><span class="line-number">180</span><br><span class="line-number">181</span><br><span class="line-number">182</span><br><span class="line-number">183</span><br><span class="line-number">184</span><br><span class="line-number">185</span><br><span class="line-number">186</span><br><span class="line-number">187</span><br><span class="line-number">188</span><br><span class="line-number">189</span><br><span class="line-number">190</span><br><span class="line-number">191</span><br><span class="line-number">192</span><br><span class="line-number">193</span><br><span class="line-number">194</span><br><span class="line-number">195</span><br><span class="line-number">196</span><br><span class="line-number">197</span><br><span class="line-number">198</span><br><span class="line-number">199</span><br><span class="line-number">200</span><br><span class="line-number">201</span><br><span class="line-number">202</span><br><span class="line-number">203</span><br><span class="line-number">204</span><br><span class="line-number">205</span><br><span class="line-number">206</span><br><span class="line-number">207</span><br><span class="line-number">208</span><br><span class="line-number">209</span><br><span class="line-number">210</span><br><span class="line-number">211</span><br><span class="line-number">212</span><br><span class="line-number">213</span><br><span class="line-number">214</span><br><span class="line-number">215</span><br><span class="line-number">216</span><br><span class="line-number">217</span><br><span class="line-number">218</span><br><span class="line-number">219</span><br><span class="line-number">220</span><br><span class="line-number">221</span><br><span class="line-number">222</span><br><span class="line-number">223</span><br><span class="line-number">224</span><br><span class="line-number">225</span><br><span class="line-number">226</span><br><span class="line-number">227</span><br><span class="line-number">228</span><br><span class="line-number">229</span><br><span class="line-number">230</span><br><span class="line-number">231</span><br><span class="line-number">232</span><br><span class="line-number">233</span><br><span class="line-number">234</span><br><span class="line-number">235</span><br><span class="line-number">236</span><br><span class="line-number">237</span><br><span class="line-number">238</span><br><span class="line-number">239</span><br><span class="line-number">240</span><br></div></div><h2 id="_06-内存分配精解（二）"><a href="#_06-内存分配精解（二）" class="header-anchor">#</a> 06.内存分配精解（二）</h2> <div class="language-txt line-numbers-mode"><pre class="language-text"><code>啊。
好，我们刚刚谈的是这一夜。
不是二页。
呃。
i, o i n i t 我们关注其中的一个内存分配的动作。从那个动作开始引发我们关注他。
一层一层的调用进去，这样用到这一个函数的时候，看到他的检查是不是超过门槛。
啊，这是刚刚的这一夜。
下一页。
在身为橙进去这个函数所做的事情是家。
啊，那个大小再加上两个整数，就是我一直讲的cookie，cookie 就是这个句子。呃，砖头设这两个东西。
然后后面这些动作就是要调到十六的边界。
所以刚刚那个图呢画的回到上一页，回到上页二十二页，这个图画的早了一点，进行到这里的时候，其实还没有加cooking。
啊，我的这个所以大家在看我的图的时候，有时候我是把整张的结果就放上来了。如果a 要按照时间次序的话，你要特别小心一点啊。
其实到这里的时候是还没有加固体的。
也因此，他们以这个门槛的时候，他不是比一零二四，它是比一零一六啊，一零一六来比这个注意一下。
现在进行到这里了，下一个动作啊，他要加上空气，在调到十六的边界，完了之后终于成形了。
我们所谓的大小有多少呢？终于全部确定下来了，然后要去。
要内存呢？
分配内存。
好，我们继续往下看。
这个分配内存这时候就出现了有所谓的region 跟所the group。
我现在先总体来讲一下，对于。
一块对于内存是怎么管理的？所谓内内内存池的管理都是怎么管理呢？都是挖一大块来做切割。
关键就是这样。
轴心就是这样。
啊。
这个就是我们前面讲的十六个黑的，这里有点点点啊，所以一开始是十六，其实这个十六以后是会增加的。
呃，十六个。
我们拿最前面这个来看这个图，前面已经先前已经划过了。
这里头两根指针，其中一根指针指向这一种东西这个东西。
他的数据结构叫做一个region。
另外一根指针指向分配到的一大块，就是要拿着一大块来细切来供应。
好。
呃，我们先耐住性子，看看他设计成这些数据结构啊，我们先我先把它画成图，先确认这个图跟。
和实际的代码是相呼应的。
先不要去讲为什么他要这样设计。
这个指针。
指向的这个叫做region。
如我为什么画成这样，因为它的定义在这里。
我们来看看这里有个整数，所以我画的这个地方。
有一个有六十四个carry it 六十四个char。我画在这里。
是非常小，但是你应该你手上的讲义你还是看的够清楚的。这里六十四个。
每一个都是一个carry itch。
接下来有这么多的东西，这个紫色的就当爱已经出现过了，就是三十二位。
三十二位，但是这里有害跟low。
所以看到害跟斗要把它并起来。
啊，因为当时在三十二位的电脑上的没有六十四位的这样的变量可以用。
所以只好用这种很土很笨的方法，这个也造成了我在看代码的时候非常的痛苦。
不过画成图啊，把这两个合在一起。
这是什么意思呢？
合起来合起来就是六十四bit 的表示这个横的六十四b。
这样子。
总共有多少呢？三十二组就这样，一二三。
往点点点有三十二组。
先不要管他做什么用啊，至少化成图，这样是相呼应的。
后面还有这个又有三十二个，这什么东西就这个structure take。
三十二个这种。
发生在这里。
三十二个。
那这就是什么东西呢？展开来画图是这样，他的定义。
在这边。
一开始是一个整数啊，画在这里威慑的这一块整数。
然后是六十四个这种东西啊，我就花六十四个。
六十四个每一个是什么？我们继续往下看。
这里六十四个这种东西这种东西就是下面这种。
是两根指针，于是我这里就。
我这边第一个有把它圈起来，就是两个为主。
总共有六十四。
就是四组双指针。
双指针。
每一个指针它指向什么样的东西呢？这个这指针指的是什么东西呢？
好，这个结构在这边。
看起来是一个总数，焊两根指针。
我在下一页会对这个话的更清楚一些。
如果以这张图来看的话啊，我们。
啊，我们就拿这个来看好了。
这是这是两根指针嘛，就是这两根。
这两根指针没一根指针所指的是这种东西，所以他不能指向他自己啊。
他前面还有一个整数。
这就是为什么我在这个图。
画的时候是往上化，这两根指针都往上画。
因为这个。
仔细体会一下，也许要。
啊，那个暂停键好好的把这一些结构看我画的这些图对应一下。
我们现在不讨论他为什么是这么设计，我们只讨论他设计出来化成土，是这样。
好。
前面我提过。
在这一步，在这一个课程上的这一部分。
相比于那个大的另外一个专门在讲内存管理的那一门课。
在这里还有一些简化，这里就是我要简化。
我将不会去谈，为什么这里要三十二个g。
我也不会去谈这里为什么要有十六个黑的，我们都只谈一个，这样比较容易理解。
各位可以想想看啊，好，现在也就是说我现在要来谈他为什么要是这样设计了。
我们如果呃作为一个shift 的管理者。
我们怎么去管西本里面的区块呢？
我们都是挖一大块内存。
有需要的时候切出去。
当我回收的时候，如果他的大小是相同的，比如说我给a b c d e 五个人。
他们要了大大小小啊，我就一一的满足他们。
但是当他们还给我的时候，如果还的大小是一样的。
比如说都是一零零。
我就想办法把他们管理在一起。
而不要散落在那整原始的那一物理那一部分。
他他们，那我还回来的这些一零零，如果有五个，他可能是。
诚实散落在。
不是连续的地方。
但我用特殊的设计，也就是现在看到的设计去把它串在一起。
这就是我做内存管理的。
几乎所有人做内存管理都是这么做的。
因此回到这个地方来。
这个设计。
叫准备的六十四条链表，这是双向链表。所以这里会有两根指针，一个指头，一个职位。
现在呢大家现在所有的都指向看起来像是指向自己，这因为这是初始状态。
好，我准备六十四条链表赴死管理六十四种大小。
我要管理人在哪里呢？在这个地方。
后面投影片会讲的更清楚，就是这一块是怎么来的。
先看一下好了下一页。
五二ha，okay, 我们说windows 有高阶的那种很低阶的内存管理，这是递接的。
要in may go。
过来细切啊，都给出去了。
回到上一页啊，现在目前主要看这一页都给出去了。当回收的时候。
有相同的大小，我们就把它列在特定的某个链表上。
这里有六十四条链表，因此他们各自的任务是什么呢？
最以前最上面这条链表负责，这是他赋予他的任务啊这个。
七这个这个叫star q 启动代码的这一部分设计赋予它什么任务呢？说你们。
将要负责串起十六个字节这一种区块。
以此类推。
所以最后一。
对链表。
负责串起。
一k 这样的大小。
再讲一次啊。
你最上面这条链表负责的是十六个字节，这来是三十二字节，然后是已被持有的倍数成长。
总共有六十四条链表。
所以最后一条链表负责的是十六乘以六十四就是一k。
我会拿起笔来算一下。
所以他心目中的小区块将来在切割出去，他本来是一个一大块。
啊，由于客户的需求开始切出去，每一块都是十六的倍数，这都是他的设计。
总共大小有六十四种。
回收的时候将会落在这些链表上头。
什么叫做落在链表上头呢？其实我要提醒各位。
我们在想这些事情的时候，脑袋里面要有两张图。
或者两种意向。
一种就是他真正在物理空间中。
一个线性空间。
其实这里也不是真正的物理空间了。物理地址这里是是是虚拟地址，这是windows 的一个设计啊。
假设啊你你对这个不太有概念，你直接想这里就是物理空间也勉强可以勉强可以。
好，所有所以呢内存永远是在这一块上面。
但是他们被分割出去再拉回来之后，为了管理方便用这六十四条链表去把它练起来。
比如说啊这里有某一号链表。
啊，他的指针拉到这一块来，拿到这里来这里又拉到这里，这里在拉拉这里这里拉这里这里拉回来。
来。
那我们就说这小链表。
维护了。
他拉过来的这一块这一块这一块这一块。
我们就这么讲。
所以有物理的。
和逻辑上的。
你一定要分两个方向去想。
好，我们继续往下看。
所以他为了要维护六十四种大小。
所以设计成这个样子有六十四条链表。
那为什么要有三十二组呢？就三十二个group 呢？这就是我前面提的，我们在这里也要把它简化。
我在这边不讲了，有兴趣的同学呢去看。
另外那一门专门在讲内存管理的那个课。
那这一些东西做什么用？
为了方便去。
去去去表现出到底哪一个链表。
有没有链区块？
有的是空的。
有的有链区块就靠这些东西来表现。
这也是我要简化的部分啊，我们不去谈论他。
我们只要知道。
这一个设计。
想要知道哪一个电表有拉有挂，真正区块的话就去看这一些it on 或off。
这样就够了。
那这整块东西。
其实是被练到这里来，这是有一个指针指向他。
这也是一个黑的。
里面的这些bit 又做什么用呢？
也是我要简化的。
靠这些，我在这里要简化啊，就是靠这些dat 去很容易找出来某些目标。
这样就够了。
在这里这样就够了。
好，我们从我们继续往下看，测试犯错了，反正到上海一夜去了，现在换到下一页。
我们从再从其他的角度再来认识的整个结构。
所以刚刚我我们回到左手边来course that 看一看。
现在一层一层的进去，终于确定大小之后，终于要去挖内存了。
所以这边的设计为了要应付这个动作。
就在这个黑的这边，终于让他去。
通过这个函数要到in a 港。
并且能建立起这样一个结构。
而这一maga。
将在一开始的时候被切成八块，为什么是八呢？这没什么好解释的，这就是他的设计。
他希望不要一次性的就管理着。emma 感太大了。
总是希望那个视野放小一点，放小一点有什么好处呢？
将来回收的时候比较容易判断啊，这一整块已经全部收回来了。
那我可以有一个比较好的处理。
其实比较好的处理就是还给操作系统。
所以总是不要。
一次性的管理太大。
这个我想这个道理很容易理解。
所以再说一次，进行到最后面这一层的时候。
就是长出了什么样的东西，上面是黑的，黑的长出了这一堆东西，为什么是三十二个，现在不去讲他。
他其中的任何一个拿出来就是六十四条链表。
这六十四条链表他们各有任务。
刚刚有提过最后一条链表，他要负责的是每一个区块是一k。
一k。
不过其实它的任务比较特别。
刚刚是讲早了。
最后一条链表所要链的区块是大于一k。
你要知道链表啊，那每一块是长什么样子，我们回到前面看一个比较详细的图。
啊，像这样。
每一块都长类似这个样子。
所以其实只针拉过来。
这一块。
多大其实无所谓，都可以被链表链起来。
这就是我要解释刚刚说最后一条链表。
他所练的大小。
只要大于e k 啊，两k 也可以呃，两k 可以吗？呃，两k 也可以，三k 也可以，一直到八k 都可以啊，这是他的设计。
你说那练过去不是要一样大小吗？我现在告诉你，那只是指针拉指针硬把它设定拉到这里。
这一块就是挂到那个列表上。
这一块有的一k 大有的三k 大，有的两k 大。那么大小都无所谓，为什么？
因为这个区块的大小是灯，是靠这个登记。
所以回到。
花边来啊，最后这一个链表。
在一开始的情况，他练了八大块。
化成这个图，这里怎么是？
这八块其实就是这八块，而这八块就是这一块。
换一个角度再讲一次。
现在终于这个地方要开始，真的要拿那一存的。
于是整个系统s bh 这个系统。
哇，这一大块来一杯卡。
拿出其中的三十二分之一。
因为他不希望一次管理那么多啊，三十二分之一三十二分之一，也就是三十二k 你除一下imma got a 除以三十二，就是三十二k。
再把这三十位可以仍然太大，再切成八块。为什么是八？
他的设计。
所以每一块就是四k。
终于这样不大不小，他认为合适的啊这四k。
哦，这四k 换一个角度，画画成这样。
这四k 之间通通幻化成当中变化成这种指针的形式串起来。
每一块是四k 幺。
终于准备妥当了。
讲了这么多干什么？因为这个地方发出需求。
所以现在终于准备妥当了。有八块要来应付。
第一次分配动作了。
那应该怎么做呢？
你可以想象。
这里有八块是真正的内存。
当然从这里要切一块出去了。
所以接下来要看的就是怎么切。
我下面准备了一张大一点的。
这个图其实就是上面这个商业这个图放大。
更清楚一些。
我们来看看有没有什么需要补充的。
好，这个放大了，所以这些数字就比较清楚了。我们来看一下啊。
回到上页啦。
这个三十二k 分为八块。
这八块就是这个每一块四k 并不是整个四零九六都是可以拿来用的。
为什么呢？
因为他刻意的要他是谁，他就是这个这个启动嘛幸福这一部分。
刻意的要把这八块分开来。
不让他合并在一起，怎么又起到合并了？那前面没有谈到合并啊，后面会讲啊，让他全部回收的时候是有机会合并的。
但是这里刻意的不让他合并。
因为现在就是要把三十二k 切小一点。
如果要是日后他又合并不是变大了嘛，就是不想让那么大。所以这个地方用黄色的这种东西啊刻意。
这样一个一个separate 一个分隔的东西，硬插进去。注意哦，这是连续的哦。
回到上一页再看一次这八块。
这八块其实是这八块。
他在物理里面它是连续的。
所以硬把它切擦一些黄色的，这网黄色就是负一。
好。
总共是四零总共是四零九六。
扣掉这个上下负一，哎，为什么他的副业他就不合并了，这是后面的话题啊。
好。
我扣掉。
上下负一。
四零九六扣掉八个字节。
呃，对，二个字节，那就是多少四零八八。
四零八八。
可是前面又讲过，在整个设计，希望每一块的大小是十六的倍数。
四零八八不是十六的倍数。
差了那么一点。
所以在这个图上就画的就是这一块保留。
四零八八刚刚算出来四零八八，但是实际上。
所以靠近十六边界的那个是四零八零。
啊，所以四零八八九四零八零的这个暴力。
要保留是好听了，其实就是浪费用不到。可惜啊，但是不得不为。
这是我们把商业这个图。
放大之后，这些数字就呈现出来了。
所以这一每一块真正可以用的就是四零八零。
各位看这种图要怎么看呢？在整个系统里面，一块空间的大小是靠哪里在决定呢？
靠上下。
我们把这种东西叫固体。
所以这一整块我是昏庸，用两种颜色来表示啊，因为我要有不同的意义啊，但是事实上在这里呢。
这一整块就是这三格，这个颜色加上白色，一直到下面这里这里。四零八零四零八零。
这一整块。
我们回到前面找一张也许你比较熟悉的，像这个。
整个系统里面的区块一定是长这种样子，一定是上下骨。
所以回到这边来。
刚刚看的是这个吗？
后调黄色就是separate 分隔符号，不能用，加上这个浪费的或者叫保留的，扣掉之后。四零八零三。
当下cookie 在这边。
那么他们中这八块由于必须串在一起，所以c 加加就用强制的方式把它这个地方当成指针，就串在一起。
反正这一块给出去的时候，这些指针可能会消失掉。
会被盖掉。没有关系啊，因为已经给出去了，本来就不再当指责。
这部分等一下会更清楚。
所以终于安排好了这个结果。这是什么？回到商业看看course。
终于进入进入进入到这个地方来了。
然后。
他在一层一层能回去。
一层一层能回去。
也就是说我们接下来要讲了，终于要在这个地方挖一块出去了。
我们最前面说我们再回到前面来，这是第这个地方啊这里。
所以内存块。
从哪里来？
大于一k 就从操作系统了，小于一k 就从刚刚讲的这么复杂的这一些。
最后是刚刚讲到，最后是八大块。
里面去切割一个出来。
大小是多少？
刚刚已经讲过了，怎么计算都已经讲完了。
所以。
啊，我们刚刚所讲的那一页。
接下来。
进入的一个主题就是怎么样从这里切一块出去。
指针要怎么移动？这个四零八零应该什么变化？
这是接下来的题目。

</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br><span class="line-number">71</span><br><span class="line-number">72</span><br><span class="line-number">73</span><br><span class="line-number">74</span><br><span class="line-number">75</span><br><span class="line-number">76</span><br><span class="line-number">77</span><br><span class="line-number">78</span><br><span class="line-number">79</span><br><span class="line-number">80</span><br><span class="line-number">81</span><br><span class="line-number">82</span><br><span class="line-number">83</span><br><span class="line-number">84</span><br><span class="line-number">85</span><br><span class="line-number">86</span><br><span class="line-number">87</span><br><span class="line-number">88</span><br><span class="line-number">89</span><br><span class="line-number">90</span><br><span class="line-number">91</span><br><span class="line-number">92</span><br><span class="line-number">93</span><br><span class="line-number">94</span><br><span class="line-number">95</span><br><span class="line-number">96</span><br><span class="line-number">97</span><br><span class="line-number">98</span><br><span class="line-number">99</span><br><span class="line-number">100</span><br><span class="line-number">101</span><br><span class="line-number">102</span><br><span class="line-number">103</span><br><span class="line-number">104</span><br><span class="line-number">105</span><br><span class="line-number">106</span><br><span class="line-number">107</span><br><span class="line-number">108</span><br><span class="line-number">109</span><br><span class="line-number">110</span><br><span class="line-number">111</span><br><span class="line-number">112</span><br><span class="line-number">113</span><br><span class="line-number">114</span><br><span class="line-number">115</span><br><span class="line-number">116</span><br><span class="line-number">117</span><br><span class="line-number">118</span><br><span class="line-number">119</span><br><span class="line-number">120</span><br><span class="line-number">121</span><br><span class="line-number">122</span><br><span class="line-number">123</span><br><span class="line-number">124</span><br><span class="line-number">125</span><br><span class="line-number">126</span><br><span class="line-number">127</span><br><span class="line-number">128</span><br><span class="line-number">129</span><br><span class="line-number">130</span><br><span class="line-number">131</span><br><span class="line-number">132</span><br><span class="line-number">133</span><br><span class="line-number">134</span><br><span class="line-number">135</span><br><span class="line-number">136</span><br><span class="line-number">137</span><br><span class="line-number">138</span><br><span class="line-number">139</span><br><span class="line-number">140</span><br><span class="line-number">141</span><br><span class="line-number">142</span><br><span class="line-number">143</span><br><span class="line-number">144</span><br><span class="line-number">145</span><br><span class="line-number">146</span><br><span class="line-number">147</span><br><span class="line-number">148</span><br><span class="line-number">149</span><br><span class="line-number">150</span><br><span class="line-number">151</span><br><span class="line-number">152</span><br><span class="line-number">153</span><br><span class="line-number">154</span><br><span class="line-number">155</span><br><span class="line-number">156</span><br><span class="line-number">157</span><br><span class="line-number">158</span><br><span class="line-number">159</span><br><span class="line-number">160</span><br><span class="line-number">161</span><br><span class="line-number">162</span><br><span class="line-number">163</span><br><span class="line-number">164</span><br><span class="line-number">165</span><br><span class="line-number">166</span><br><span class="line-number">167</span><br><span class="line-number">168</span><br><span class="line-number">169</span><br><span class="line-number">170</span><br><span class="line-number">171</span><br><span class="line-number">172</span><br><span class="line-number">173</span><br><span class="line-number">174</span><br><span class="line-number">175</span><br><span class="line-number">176</span><br><span class="line-number">177</span><br><span class="line-number">178</span><br><span class="line-number">179</span><br><span class="line-number">180</span><br><span class="line-number">181</span><br><span class="line-number">182</span><br><span class="line-number">183</span><br><span class="line-number">184</span><br><span class="line-number">185</span><br><span class="line-number">186</span><br><span class="line-number">187</span><br><span class="line-number">188</span><br><span class="line-number">189</span><br><span class="line-number">190</span><br><span class="line-number">191</span><br><span class="line-number">192</span><br><span class="line-number">193</span><br><span class="line-number">194</span><br><span class="line-number">195</span><br><span class="line-number">196</span><br><span class="line-number">197</span><br><span class="line-number">198</span><br><span class="line-number">199</span><br><span class="line-number">200</span><br><span class="line-number">201</span><br><span class="line-number">202</span><br><span class="line-number">203</span><br><span class="line-number">204</span><br><span class="line-number">205</span><br><span class="line-number">206</span><br><span class="line-number">207</span><br><span class="line-number">208</span><br><span class="line-number">209</span><br><span class="line-number">210</span><br><span class="line-number">211</span><br><span class="line-number">212</span><br><span class="line-number">213</span><br><span class="line-number">214</span><br><span class="line-number">215</span><br><span class="line-number">216</span><br><span class="line-number">217</span><br><span class="line-number">218</span><br><span class="line-number">219</span><br><span class="line-number">220</span><br><span class="line-number">221</span><br><span class="line-number">222</span><br><span class="line-number">223</span><br><span class="line-number">224</span><br><span class="line-number">225</span><br><span class="line-number">226</span><br><span class="line-number">227</span><br><span class="line-number">228</span><br><span class="line-number">229</span><br><span class="line-number">230</span><br><span class="line-number">231</span><br><span class="line-number">232</span><br><span class="line-number">233</span><br><span class="line-number">234</span><br><span class="line-number">235</span><br><span class="line-number">236</span><br><span class="line-number">237</span><br><span class="line-number">238</span><br><span class="line-number">239</span><br><span class="line-number">240</span><br><span class="line-number">241</span><br><span class="line-number">242</span><br><span class="line-number">243</span><br><span class="line-number">244</span><br><span class="line-number">245</span><br><span class="line-number">246</span><br><span class="line-number">247</span><br><span class="line-number">248</span><br><span class="line-number">249</span><br><span class="line-number">250</span><br><span class="line-number">251</span><br><span class="line-number">252</span><br><span class="line-number">253</span><br><span class="line-number">254</span><br><span class="line-number">255</span><br><span class="line-number">256</span><br><span class="line-number">257</span><br><span class="line-number">258</span><br><span class="line-number">259</span><br><span class="line-number">260</span><br><span class="line-number">261</span><br><span class="line-number">262</span><br><span class="line-number">263</span><br><span class="line-number">264</span><br><span class="line-number">265</span><br><span class="line-number">266</span><br><span class="line-number">267</span><br><span class="line-number">268</span><br><span class="line-number">269</span><br><span class="line-number">270</span><br><span class="line-number">271</span><br><span class="line-number">272</span><br><span class="line-number">273</span><br><span class="line-number">274</span><br><span class="line-number">275</span><br><span class="line-number">276</span><br><span class="line-number">277</span><br><span class="line-number">278</span><br><span class="line-number">279</span><br><span class="line-number">280</span><br><span class="line-number">281</span><br><span class="line-number">282</span><br><span class="line-number">283</span><br><span class="line-number">284</span><br><span class="line-number">285</span><br><span class="line-number">286</span><br><span class="line-number">287</span><br><span class="line-number">288</span><br><span class="line-number">289</span><br><span class="line-number">290</span><br><span class="line-number">291</span><br><span class="line-number">292</span><br><span class="line-number">293</span><br><span class="line-number">294</span><br><span class="line-number">295</span><br><span class="line-number">296</span><br><span class="line-number">297</span><br><span class="line-number">298</span><br><span class="line-number">299</span><br><span class="line-number">300</span><br><span class="line-number">301</span><br><span class="line-number">302</span><br><span class="line-number">303</span><br><span class="line-number">304</span><br><span class="line-number">305</span><br><span class="line-number">306</span><br><span class="line-number">307</span><br><span class="line-number">308</span><br><span class="line-number">309</span><br><span class="line-number">310</span><br><span class="line-number">311</span><br><span class="line-number">312</span><br><span class="line-number">313</span><br><span class="line-number">314</span><br><span class="line-number">315</span><br><span class="line-number">316</span><br><span class="line-number">317</span><br><span class="line-number">318</span><br><span class="line-number">319</span><br><span class="line-number">320</span><br><span class="line-number">321</span><br><span class="line-number">322</span><br><span class="line-number">323</span><br><span class="line-number">324</span><br><span class="line-number">325</span><br><span class="line-number">326</span><br><span class="line-number">327</span><br><span class="line-number">328</span><br></div></div><h2 id="_07-内存分配精解（三）"><a href="#_07-内存分配精解（三）" class="header-anchor">#</a> 07.内存分配精解（三）</h2> <div class="language-txt line-numbers-mode"><pre class="language-text"><code>嗯嗯。
好我们已经了解了，这整个这整个到底是什么东西呢？
其实就是搭扣启动代码的keep这一部分所提供的。
呃这个功能已经进行到了，当客户现在的客户就第一个动作是I。
O、I，N、I。
T，他要求去快，于是整个这个第一曲筱区块，S，small，block，keep长出了这种结构出来，开始要应付它。
终于第一刀要下去了，而且多大呢？
还记得吗？
到前面来，刚刚说所有的程序都一样，因为这段代码是所有的程序都要经历的。
这一段代码说我我来看看，我要往上看啊，看i、o、i、n、i、t，这边发出来两百五十六个字节，要切两百五十六，不过两百五十六要经过膨胀，刚刚也都谈过了，怎么膨胀啊？
膨胀出来应该是一、三、零。
诶这刚刚都讲过。
好啊，现在我们继续到这里，终于要在这八块里面切出一。
三。
零h这种大小了。
下一页。
这个就是切的动作，这一整块这个要上下对照看啊大家这个。
呃注意上面也是这样，就是这一块放大就是这一整块，在这一整块里面切出这一块，就是一。
三。
零十六进位的一三年这一块我现在放大，它是长这个样子。
他切出去之后就变一、三、一了。
因为我说需要它的设计需要有一个B的来表现现在是什么状态，是给出去的还是在他在这个SB，ah手中？
好，切出去这里就变一、三、一。
这些东西前面曾经都讲过了，通通都讲过了。
切出去之后，那原来这一块的大小是怎么计算呢？
这个没有办法按照比例来画，完全没办法。
呃这个地方我们看看。
的大小。
这个整个从这个黄色以下跟这个黄色以以上，刚刚你看到是四零八零啊，现在变成什么样子？
怎么算的这个F F零就是四零八零，上一页就是本来的四零八零，现在切了一三零出去，得到的就是这个词，也就是这一个。
好好的体会这个图嗯花了很多心思去画的，这一块就是这一个程度。
那怎么表现这个长度呢？
这一块也是有上下估计的，所以就把这个长度登记在这里，看这里。
呃这一块就变成了这种大小了。
我这边画了一个剪刀啊，从这个地方切开来，怎么样叫做给出去呢？
那首先他这变小了，变成这么大了，那就是切掉了。
至于这一块给怎么给出去呢？
只要把这一块这个地方啊现在放大，是这样吗？
把这个指针传出去，指针要指向这里。
哦因为客户他认为他只拿到浅绿色这一块，我们是回头看一下这个code。
所以刚刚在这个地方进去之后，开始要一层一层退出来，那个指针会在这一层一层退出来的时候一直在移动。
讲到这个地方啊这一块切出来之后，一开始retain回去的指针也许是这里啊这这个得也也许是这里，因为我得看源代码才能够更精准的讲啊。
那也许是这里一层一层的回去，它会一直移动，他最后客户拿到的是指向这里，因为客户根本就不知道有上下这些东西，他只知道啊他只认为他收到的是浅绿色这一块，那客户拿到的这个指针他就会有他就有权利在这上面做事情。
那我们就说这一块切出去的确也是切出去了，因为在sbs手中已经看不到这一块，他所看到的是这一个。
喊这一个，也就是这一块，他只看到这一块。
这就是七个。
依此类推，我们继续往下看。
呃我就翻到上一页，现在要方向错，现在再往下。
所以刚刚看的这个是细部动作嘛，放得很大。
现在呢把它整把这个图总图画出来，我们说有十六个黑的，每一个黑的所管理的事情什么？
imaged里面的三十二k三十二k切成八块，而这八块换一个角度画，画成这样是有六十四条。
电表来管理，所以一开始是最后一个链表，负责负责把这八块练起来。
现在要切第一刀，把这一块放大，终于切出了一。
三、零。
一。
三。
零是所有的程序都会面临的，因为I、O、I、N、I、T要的就是一、三、零，于是剩下一丝一。
零，这就是首次分配首次分配。
好，注意这句话，这个算出来的结果是一三零啊一三零。
按理说应该由第十八号链表来供应呢这个地方。
这里有六十四条链表，按道理讲应该有它应该有一个对应的列表，这里是一、三、零嘛。
拿起笔来。
除法啊十六进位除法，不知道你熟不熟啊，反正我也不管了。
或者你换成十斤，为了去除吧，你把一、三、零、七除以十六，呃也许还要扣呃应该还要减一，因为这边是从零开始算，你就会算出来。
应该有一个链表专门来应付这种大小。
那应该算出来是十八，拿起笔来把它算一下。
哦应该是八，但因为现在的。
情况，这些链表全部都是空的，只有最后一个链表是有挂这一些，所以第十八号电表起不了作用，它是空的。
所以往下找怎么找呢？
就是我前面讲说我们这里不去提它就是靠这些信息去找，最后发现啊以现在情况当然是最后一个链表的这些才能够起作用，所以就从这里切出去了。
这是特别要解释这一句话，按理应该如此，但实际上呢它是空的，所以才导致这张图。
好，这是第一次分配，第二次分配。
分配的是多少？
刚刚是一。
三。
零嘛，没有办法按比例画啊。
这一次分配的是切出去二十四里，后面我们再观察整个启动代码。
在做字符串的处理的时候，我们可以解释为什么它是二十四位。
好，这里要切出二、四、零，切法完全一样。
所以切了以后呢，所以原来的这一块又缩小一点了，现在变成C一八零。
以此类推。
这是第二次啊。
下一页。
第三次，又切小一点。
现在已经切除这块这一块和这一块了，三块第三次。
其他列表有没有东西？
没有啊。
一直都是由最后这个链表因为是很蛮大的，你看每次切都很小，所以一直由他来供应。
如果他切完了换他他切完了换他，一直到这些东西都切完了才会有后续。
呃再补充。
再往下。
第一哦，刚刚是第三次嘛，一直切切切切到第十四次都是切的动作。
为什么会这样？
然后它的大小我等一下都可以解释到了第十五次，在我的例子里面观察到呢有一个释放的动作。
好，我们来看看他的行为。
在次的释放，释放的是多大呢？
我看看这张图，要从哪一个地方看起？
释放。
好。
要释放的是这一块白色的这一块，它的大小是二四零二四零四。
该该怎么办？
他应该会去做一个检查的动作，看看往上往下看要不要合并啊？
我合并这个话题呢我们放到后头再来谈，那以现在这个眼睛一看呢，知道是不合并，因为什么这是物理空间，它的上头是已经切出去的，它的下头也切出去了。
他是还回来白色的，所以没有办法跟谁合并，所以他应该回收到哪里去呢？
它的大小是二十四厘米，这里有一个除法，二、四、零除以十六，也就是除以一。
零。
h。
为什么要除以十六？
因为这些链表的任务各自的任务就是以十六的倍数在变化的，所以他一除下来是三。
六，就知道说这一块按道理讲应该由这除下来三十六嘛，那就是有三十五号，因为从零开始算，从三十五号链表应该负责去回收它。
我提过哦，您的头脑里面一定要有量。
两个意向，就两个角度去看啊。
首先这是物理空间，这一块就是这一块，这一块其实是串在一起的，前面都提过这是物理，但这一块回收之后呢，在逻辑上，这整个S、B、H的设计上，要有人把它登记起来，这个人就是这里的第三十五号链表。
所以这里链表是有双指针嘛，这个指针就被这个城市马的设定设定为你看这边。
指向这这里，而指向这里之后呢，他的下一个，我看看这边的图。
没有办法，就太复杂了。
没有。
呃划拳，我可以在这边拉给你看这个蓝色蓝色的这一根直到这里，那就是把这个二、四、零啊回收的意思就归他管了。
那这一块的这一个蓝色指针我就没有再画下去了。
它的下一块在哪里？
他这是第一次回收啊，所以他的下一块就要再拉回来，我没有话了啊。
呃再拉回来，拉回到三十五号，因为是双向链表，所以一个拉过去，那边也要拉回来，这样就串在一起了，就是用三十五号回收的意思。
如果继续往下运作，又有一次释放，是二、四，零这种大小。
如果啊。
在物理上不知道他在哪里，但如果有这么一块，那么一样是二、四、零这种大小啊，就仍然应该由第三十五号链表把它串起来。
那目前三十五号已经到了，这边是第一个了，这边的指针就将会去拉去串联到第二个，然后第二个也是最伟大的那一个再传回来，这样就形成了在逻辑上、管理上面呢，第三十五号链表练住的两块，二、四、零这种大小呃区块。
那这样子回收有什么好处呢？
当下一次因为客。
客户嘛，客这是C，雅迪这是library，他要应付各种大小。
假设现在第三十五号列表列了两块二、四、零这种大小，下一次有客户要二。
四、零这么大的时候，这边一比，对啊，那就直接由三十五号给他，刚刚好，也不用切割，也不会有碎片啊，不会浪费，没有任何的副作用，因为它是完全刚好的大小。
所以我们从前面的再看一次，从前面的这个首次分配，然后第二次、第三次，终于到了第十五次，看到一个回收动作，所谓回收你就知道了，挂到。
对应的列表上，就这样一直进行下去。
好，刚刚看到第十五次啊。
那么第十六次在这个实际观察里面又看到一件有趣的事情，第十六次要分配，分配的是多大呢？
分配的是一九零一九年，现在是什么情况？
看一下回到上一页看一下，这里有这么多列表，最后这一组这一组链表呢这一对链表啊这一个链表啊这些内存，第三十五号链表也有这么一个内容，这是目前的情况。
然后下一个。
工作说我要客户要要多少？
要一九零。
那如果你是决决策者，你应该拿哪一块给他？
一。
九。
零来应付这个一。
九。
零的需求？
你手上拥有的是一块。
第三十五号啊是二。
四。
零，这个比一九零大，后面这个八大块也都比一九零大更大。
啊如果你是决策者，你当然应该靠拿那个最靠近的去切大的，尽量保留已被日后要用啊，不要一一开始就是把它切成小块。
这样以后要默许要合并了，有点麻烦，有点讨厌也不是不能，但是有点讨厌。
所以在第十六次分配的时候，他所拿出来切的就是刚刚上一页这这一块，因为这一块最靠近他，所以靠近需求。
那一切完之后，第十六次啊这个一切完之后呢，这本来是二。
四。
零嘛，你看上一页是二四零，这没没有按照比例画二四零。
现在看下一页，签了一九零，仔细看这个图啊，二四零切的一九零，他就剩下b零一。
零。
我们又要重新计算了这个代码又要重新计算了。
B零应该规定二十四号链表。
哎管理为什么这里有？
呃。
我看一下啊这一次到底要的是一九零还是幺八零啊刚刚嘴巴讲太快了，刚刚说我看一下这个数字，应该把它写出来的。
所以从这个图上来看，这一次第十六次要的是B零A，B的B，B零上一页说有二、四、零，这一页说要碧林，所以要把它剪掉。
掉以后，他剩下一。
九。
零，所以这边才一。
九。
零去除以十六啊这一块应该重新调整。
本来是上个月是由三十五号去管这一页调整了，因为它变小了，所以有二十四号把它练起来，指针拉一拉就练起来了。
所以我们脑袋里面的那个画面，你要你要以它是一个动态一直在变的。
啊切一刀变小啦，合并了变大啦。
这个六十四对指针，六十四个链表，它在拉动，不断地在调整。
好，这是第十六次的分配，那么就这样一直进行下去啊，第n次的分配。
这张。
图没有什么没有什么特别要说明。
至于中间这一些这一页啊，第n次有这些东西，上一页呢有这些东西，在上一页也有这些。
就是我这边说我我们很细节的地方我们不去谈，它是为了帮助整个代码去找到适当的链表，用一些零啊、一呀的这种控制啊。
有兴趣的话再去看这个我的另外那门课，内存管理。
好，这个就是我们在这边看到的切割以及链表的不断的变化。
那下面有一个小主题，就是合并回收之后怎么合并？
刚刚你看到它有回收。
而是没有合并，因为他上下一看，没有谁跟他是相同身份。
接下来我们就要看合并。

</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br><span class="line-number">71</span><br><span class="line-number">72</span><br><span class="line-number">73</span><br><span class="line-number">74</span><br><span class="line-number">75</span><br><span class="line-number">76</span><br><span class="line-number">77</span><br><span class="line-number">78</span><br><span class="line-number">79</span><br><span class="line-number">80</span><br><span class="line-number">81</span><br><span class="line-number">82</span><br><span class="line-number">83</span><br><span class="line-number">84</span><br><span class="line-number">85</span><br><span class="line-number">86</span><br><span class="line-number">87</span><br><span class="line-number">88</span><br><span class="line-number">89</span><br><span class="line-number">90</span><br><span class="line-number">91</span><br><span class="line-number">92</span><br><span class="line-number">93</span><br><span class="line-number">94</span><br><span class="line-number">95</span><br><span class="line-number">96</span><br><span class="line-number">97</span><br><span class="line-number">98</span><br><span class="line-number">99</span><br><span class="line-number">100</span><br><span class="line-number">101</span><br><span class="line-number">102</span><br><span class="line-number">103</span><br><span class="line-number">104</span><br><span class="line-number">105</span><br><span class="line-number">106</span><br><span class="line-number">107</span><br><span class="line-number">108</span><br><span class="line-number">109</span><br><span class="line-number">110</span><br><span class="line-number">111</span><br><span class="line-number">112</span><br><span class="line-number">113</span><br><span class="line-number">114</span><br><span class="line-number">115</span><br><span class="line-number">116</span><br><span class="line-number">117</span><br><span class="line-number">118</span><br><span class="line-number">119</span><br><span class="line-number">120</span><br><span class="line-number">121</span><br><span class="line-number">122</span><br><span class="line-number">123</span><br><span class="line-number">124</span><br><span class="line-number">125</span><br><span class="line-number">126</span><br><span class="line-number">127</span><br><span class="line-number">128</span><br><span class="line-number">129</span><br><span class="line-number">130</span><br><span class="line-number">131</span><br><span class="line-number">132</span><br><span class="line-number">133</span><br><span class="line-number">134</span><br><span class="line-number">135</span><br><span class="line-number">136</span><br><span class="line-number">137</span><br><span class="line-number">138</span><br><span class="line-number">139</span><br><span class="line-number">140</span><br><span class="line-number">141</span><br><span class="line-number">142</span><br><span class="line-number">143</span><br><span class="line-number">144</span><br><span class="line-number">145</span><br><span class="line-number">146</span><br><span class="line-number">147</span><br><span class="line-number">148</span><br><span class="line-number">149</span><br><span class="line-number">150</span><br><span class="line-number">151</span><br><span class="line-number">152</span><br><span class="line-number">153</span><br><span class="line-number">154</span><br><span class="line-number">155</span><br><span class="line-number">156</span><br><span class="line-number">157</span><br><span class="line-number">158</span><br><span class="line-number">159</span><br><span class="line-number">160</span><br><span class="line-number">161</span><br><span class="line-number">162</span><br><span class="line-number">163</span><br><span class="line-number">164</span><br><span class="line-number">165</span><br><span class="line-number">166</span><br><span class="line-number">167</span><br><span class="line-number">168</span><br><span class="line-number">169</span><br><span class="line-number">170</span><br><span class="line-number">171</span><br><span class="line-number">172</span><br><span class="line-number">173</span><br><span class="line-number">174</span><br><span class="line-number">175</span><br><span class="line-number">176</span><br><span class="line-number">177</span><br><span class="line-number">178</span><br><span class="line-number">179</span><br><span class="line-number">180</span><br><span class="line-number">181</span><br><span class="line-number">182</span><br><span class="line-number">183</span><br><span class="line-number">184</span><br><span class="line-number">185</span><br></div></div><h2 id="_08-内存分配精解（四）"><a href="#_08-内存分配精解（四）" class="header-anchor">#</a> 08.内存分配精解（四）</h2> <div class="language-txt line-numbers-mode"><pre class="language-text"><code>好，前面我们看到了切割的动作。
啊，以及这个这些区块呢在不同的时间，由于被切割呃变大了，呃，不是切割之后当然变小了，变小了他就归属于不同的链接。
表来维护他，来管理他。
现在来看合并。
合并必然是发生在。
归还内存块的时候就是free 释放的时候。
合并这个动作要怎么去检查呢？
在。
我刚刚一再的强调，而也就是这句话，注意啊，你的脑袋里面要有两张画面，也就两个印象。
一个是内存块处于线性空间。
实际的物理的。
一个是内存块处于自由链表之中，就是被链表以逻辑的方式指针拉过去。指着他。
嗯，你要存在这两个画面。
那么现在当一个内存块释放。
他要去检查能不能合并，这样往因为一一内存块的地址来讲，就有高有低嘛，就从低到高或者从高到低呢。
他要去看看，往上看，往下看有没有谁跟他一样的身份，那才能合并。
所谓身份就是两种，一种就是给出去的，一种就是收回来了。
对于系谱的管理者来讲，给出去给客户给出去了。
给给出去货收回来就靠什么呢？往前再看一下熟悉的画面。
好，这个这个固体的最后一个。
所以状态只有两种，零或一。
好，我们现在回到刚刚的那一夜来。
零或一，但是要检查一定是通过物理的那个角度去看。
这里呀两个意向。
如果通过自由链表那个角度去看，是看不到什么东西的。因为蚩尤链表那个角度呢，它是从指针指出去，他可能指向方块。
可是这三块呢在物理之中。
也许相连，也许不相连。
那你根本无无从知道他相连或不相连。
因为他只是指针拉把他们串在一起而已。
所以。
要看是不是合并，一定是从物理的角度看。
好，我们现在看这个图。
同时这个解释也就会可以去解释，也许本来就存在你心中的疑惑，为什么要有下面这个。
感觉不是有上古皮就够了吗？上物体记录的整个的长度为什么要下鼓起？
啊，我们。
来看这个。
合并的动作。
假设现在的状况是这样。
其中呢？
目前要还的是白色这一呃砖头式的这一块，这边有有一个人用弓箭指着啊，我的意思就是要还这一块。
这一块环的大小是三百。
我刚刚提到一定要看物理的，从物理的角度看，你就往上看往下看。
你不能去算算三百，他将来回收是属于哪一个链表，从链表的角度去看，这是。
不对的不起作用的。
对于合并还是不起作用。
所以这个地方只针的这个地方，要看看上面呃，我看是先往下看，还是先往上看啊。好。
先往下看。
我这一段代码。
杀寇。啊。呃，这一段代码应该怎么写呢？
我想知道下面这一块。
是不是白色的，也就是这个b 的是不是零？
我该怎么做呢？
我把指针往上移动四个字节到这里。
我现在换了一个角度。
这样子比较不会。
遮住这个图片。
回收的指针在这边。
我想知道下面这一块的状态。
我把指针。
看啊。
好，这样可以，我把指针往上移到这个位置，这个是四个字节，所以很容易移动。
距离知道。
这样就得到这个长度是三零一，其实就三零零了。
于是从这个地方加三零零就到下一块的起点。
下一块的起点一定是一个哭泣。
我就可以看看他最后一个bit，it 是零或者一。
以现在这个状况他可以马上可以判断它是零嘛。所以这一块下面这一块也是已经回收的。
我现在正要回收这一块。
啊，那么我一看上面这一块已经回收了。
他的长度多少呢？三零零。
我这个例子刚好目前回收三零零，而这下面也是三零零，但这只是刚好而已，这个不具任何作用，不具任何意义。
ok 所以这个我们这个启动代码的这一部分就知道了。原来这两块是可以合并，因为他们身份相同啊。
这两个合并要怎么做呢？变成右边，这样太简单了。
就把这两个当成一块。
当时一块长度以这个例子来看，三零零加三零零就六零零。
啊，只要把这个六零零写到上下，估计就好了。
他就这一块就变成六零零了。
然后再去看看六零零这种大小。
在逻辑的角度上看，这边他应该有第七号链表，把它链中。
这就是这个图变换成像中间这个。
过渡过程。
但是这个往下看还不够啊，还应该在网上看。
在网上看看看上现在这个人拿着箭头是指向这一块，所以他的上面这一块。
那怎么看呢？是什么状态呢？
我们再看一次啊，刚刚只是在这里。
箭头所指的这个这个这根弓箭所指的这个位置。
往上移动四个字节。
再往上再移动四个字节，那就是上一块的底部。
也就是下蛊。
下蛊。
这就是为什么要有夏宫给的原因。如果没有下，只有上攻击而没有下过给的话，我们永远。
这段这些代码永远没有办法知道上一块的状态。
现在可以知道了，所以在这个地方再往上刚刚的说明啊，网上一看上一块的状态是。
三零零。
最后一个bit，士林可见这一块也是已经回收了。
可以跟他合并。
那我这个例子刚好又是三零零，它的长度啊，这三块都是三零零，这个不具任何意义，只是刚好而已。
所以现在六零零再跟上面合并，就是九零零。
那么终于。
九零零，这是最后结果了，就把这个上下q 可以设为九零零。
然后这已经计算到最尾巴了，不会再有变化了。
还有一个再往下看和网上看呢。
不不必啊绝对不必因为每一次回收都会往下往上看。
所以。
任何一次回收绝对不需要更往下以及更往上看，绝对不必。
好，这东终于。
合并了之后，他现在是九零零，所以这个这一整块应该有哪一号链表去管呢？啊，这个除一下怎么除啊。
除以十六。
减一。
因为从零开始算啊，所以减一这样就是他花落何家，他该落到哪里去呢？就这样把它算出来。
但是这个过程里面。
现在好像是这一块。
那么上下本来以这个例子来看，都是三零零，所以他们相对应的那个链表本来是电子这两块哦。
那些都要打断。
啊，因为经过核。
之后呢已经不存在这两个三零零了。
现在是一整块九厘米。
所以我希望大家能够能够。
就是。
这是很需要花时间去揣摩，就慢慢体会这些图片啊，你应该要感受到就是在。
切割回收合并的这些动作都会造造成这个六十四条链表。
的指针一直在变动一直在变动。
好，这是一个合并动作，有一些编译器给的。
这cr 编译器会附带ce rt 嘛。
我们现在整个在讲的都是crt 的这个启动码的部分。
有一些编译器在他所带的酷，在设计这些这整个机构的时候啊，只有设计上面这个估计。
没有设计下面这个估计。
那就会造成合并的时候缺了一个方向。
他真的会有有这样的编译器吗？有以前的vc 呃，all enc 就是这样。
相当早了相当早。
现在这个已经变成业界标准，就是要有上下国际vc 以及跟路c gcc 都是这么做的。
好，我们再往下。
这样整个故事就讲完了。
我们终于知道了，所谓的初始化其实只是十六根，十六个头header。
接下来应付各式各样的需求以及回收，才会长出那些链表，出来那些所谓的group。
那些数据结构。
好，我们看这个。
其实刚刚在回收的时候，在合并了，合并就是这里这里合并。
就是发生在free 这个函数。
现在往下看，注意这边也有几句话啊。
free 这个p 这是一个指针花落谁家？我是在问什么呢？
这里有十六个黑的，以后还会更多。
每个黑的下来，这里有这么多。我们刚刚说为了简化，我们只看一个，其实他有三十二个。
所以这根指针到底是落在哪一块？
责任区内。
那一个header 里面的那一个group 里面的那一个链表内，这就是这些。
问题。
前面我说我们的本堂课的这一部分要简化，所以这个地方我不予讨论。
有兴趣的话去看我的。
内存管理的那门课，这里我们不予讨论。
小叶。
现在问大家一个问题。
当客户归还也就是释放就调用free。
啊，所有的内存块多还给这个系统。
这个客户包括谁？包括应用程序，现在可能进行到在再进行下去就要进入man 了。
所以我们也会去分配内存，也是走的是整个这一条路。
所以客户包括我们写的程序。
也包括crt 自己。
crt 还有其他代码，他也要用到内存，所有这些反正要用内存这些人。
终于都释放了那种。
那么整个系统会呈现什么面貌？
你说你怎么问我这个问题，这个是怎么会有答案呢？
啊，如果你的想象，你可能会想说，那反正就是这么播主的链表上面可能挂着一些区块吧。
反正某一某一条链表，他挂的区块都是一样大小。
蹭蹭吃吃。这个这个零零算法，那可就这样吧，哪里有什么最终面貌可言？
啊，也许你会直觉的这样子反问。
但是别忘了，刚刚我们讲过区块会核定。
所以分割出去。
回收回来这边有讲啊，客户回收了释放所有的内存块。
所以最终他们会合并。
合并成什么样子河变成最初始的样子？
最初始是什么样子，就是这个样子啊。
八大块。
本来这八块还是可以那个代码可以把他们再合并。但是前面我们说了，刻意放上separator。
分隔的东西。
这里是负一把它硬岔开来。
所以他不能再合并了，这就是最原始的状态。
其实现在你可以知道啊，已经可以想象为什么这个放黄色这个负一。
会造成他不能合并。
我们这张图前面有一个大图，我们往前看。
啊，这个。
好几张都一样。
好。
这些东西在物理上，我看这一张可能还不太好，我看看能不能找到一张我要的。
ok 非常好了。
其实一样啊，都可以，这八块就是这八块。
在物理上，他们是连续的，是因为切成这八块，用指针串起来。
本来是他们可以合并，但是我们刚刚已经看过了合并的程序他要往上看，顾客往下看空间。
啊，他自己这一块现在是四零八零，但往下看公屏往上看。工地。
代码的设计让他是怎么设计。说往下看空体。如果裤皮是负一，那就是一个这里黄色的部分。
特定的分隔符。
如果不是负一。
那除非这个代码整个最后错乱，除非这样啊，不然的话呢，如果不是负一，那一定是真的是个。
往上看也真的是个无敌。就按照刚刚的方式去运算。
那现在看到负一啊，那个代码会这样写，然后一副看到cookie 是负一，就呃就下面就不做了，就是不合并了。
这是他刻意安插负一的作用。
好，我们回到刚刚讲到哪一页呢？这个合并。
花落谁家刚刚讲到这里了，以及这个最后。
而呈现的就是这八块不合并。
刻意的。
终于去把这个主题讲完了。
我们。
前面提过vc 六，我们借助于crt 提供的这个启动代码的这一块部分了。我们彻底理解所谓。
小区块的管理，我们前面也谈过了，vc 十。
这一块全部拿掉。
所谓的s bhs 就small 这一块全部拿掉。
但是我已经刚才已经告诉你了，全部被拿到操作系统来一面。
我们后面会有一个小单元介绍操作系统。
西a lock。
windows 操作系统有提供这么一个a p i 啊，他的行为。
啊，还在还没有进行到那一个主题之前。
我们在这个地方。
终于能够看到一个和我在另外一门课内存管理那门课里面不一样的东西了。
那就是我要借着。
这个star up 靠处理字符串。
的一些细节。
来解释每一个数据，每一个细部的数据，这样我们心里就会非常非常踏实啊，我们把这个走一遍。
接下来我们要来看这些。
数据也是一些证据。

</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br><span class="line-number">71</span><br><span class="line-number">72</span><br><span class="line-number">73</span><br><span class="line-number">74</span><br><span class="line-number">75</span><br><span class="line-number">76</span><br><span class="line-number">77</span><br><span class="line-number">78</span><br><span class="line-number">79</span><br><span class="line-number">80</span><br><span class="line-number">81</span><br><span class="line-number">82</span><br><span class="line-number">83</span><br><span class="line-number">84</span><br><span class="line-number">85</span><br><span class="line-number">86</span><br><span class="line-number">87</span><br><span class="line-number">88</span><br><span class="line-number">89</span><br><span class="line-number">90</span><br><span class="line-number">91</span><br><span class="line-number">92</span><br><span class="line-number">93</span><br><span class="line-number">94</span><br><span class="line-number">95</span><br><span class="line-number">96</span><br><span class="line-number">97</span><br><span class="line-number">98</span><br><span class="line-number">99</span><br><span class="line-number">100</span><br><span class="line-number">101</span><br><span class="line-number">102</span><br><span class="line-number">103</span><br><span class="line-number">104</span><br><span class="line-number">105</span><br><span class="line-number">106</span><br><span class="line-number">107</span><br><span class="line-number">108</span><br><span class="line-number">109</span><br><span class="line-number">110</span><br><span class="line-number">111</span><br><span class="line-number">112</span><br><span class="line-number">113</span><br><span class="line-number">114</span><br><span class="line-number">115</span><br><span class="line-number">116</span><br><span class="line-number">117</span><br><span class="line-number">118</span><br><span class="line-number">119</span><br><span class="line-number">120</span><br><span class="line-number">121</span><br><span class="line-number">122</span><br><span class="line-number">123</span><br><span class="line-number">124</span><br><span class="line-number">125</span><br><span class="line-number">126</span><br><span class="line-number">127</span><br><span class="line-number">128</span><br><span class="line-number">129</span><br><span class="line-number">130</span><br><span class="line-number">131</span><br><span class="line-number">132</span><br><span class="line-number">133</span><br><span class="line-number">134</span><br><span class="line-number">135</span><br><span class="line-number">136</span><br><span class="line-number">137</span><br><span class="line-number">138</span><br><span class="line-number">139</span><br><span class="line-number">140</span><br><span class="line-number">141</span><br><span class="line-number">142</span><br><span class="line-number">143</span><br><span class="line-number">144</span><br><span class="line-number">145</span><br><span class="line-number">146</span><br><span class="line-number">147</span><br><span class="line-number">148</span><br><span class="line-number">149</span><br><span class="line-number">150</span><br><span class="line-number">151</span><br><span class="line-number">152</span><br><span class="line-number">153</span><br><span class="line-number">154</span><br><span class="line-number">155</span><br><span class="line-number">156</span><br><span class="line-number">157</span><br><span class="line-number">158</span><br><span class="line-number">159</span><br><span class="line-number">160</span><br><span class="line-number">161</span><br><span class="line-number">162</span><br><span class="line-number">163</span><br><span class="line-number">164</span><br><span class="line-number">165</span><br><span class="line-number">166</span><br><span class="line-number">167</span><br><span class="line-number">168</span><br><span class="line-number">169</span><br><span class="line-number">170</span><br><span class="line-number">171</span><br><span class="line-number">172</span><br><span class="line-number">173</span><br><span class="line-number">174</span><br><span class="line-number">175</span><br><span class="line-number">176</span><br><span class="line-number">177</span><br><span class="line-number">178</span><br><span class="line-number">179</span><br><span class="line-number">180</span><br><span class="line-number">181</span><br><span class="line-number">182</span><br><span class="line-number">183</span><br><span class="line-number">184</span><br><span class="line-number">185</span><br><span class="line-number">186</span><br><span class="line-number">187</span><br><span class="line-number">188</span><br><span class="line-number">189</span><br><span class="line-number">190</span><br><span class="line-number">191</span><br><span class="line-number">192</span><br><span class="line-number">193</span><br><span class="line-number">194</span><br><span class="line-number">195</span><br><span class="line-number">196</span><br><span class="line-number">197</span><br><span class="line-number">198</span><br><span class="line-number">199</span><br><span class="line-number">200</span><br><span class="line-number">201</span><br><span class="line-number">202</span><br><span class="line-number">203</span><br><span class="line-number">204</span><br><span class="line-number">205</span><br><span class="line-number">206</span><br><span class="line-number">207</span><br><span class="line-number">208</span><br><span class="line-number">209</span><br><span class="line-number">210</span><br><span class="line-number">211</span><br><span class="line-number">212</span><br><span class="line-number">213</span><br><span class="line-number">214</span><br><span class="line-number">215</span><br><span class="line-number">216</span><br><span class="line-number">217</span><br><span class="line-number">218</span><br><span class="line-number">219</span><br><span class="line-number">220</span><br></div></div><h2 id="_09-main-生前所有内存分配"><a href="#_09-main-生前所有内存分配" class="header-anchor">#</a> 09.main 生前所有内存分配</h2> <div class="language-txt line-numbers-mode"><pre class="language-text"><code>嗯嗯嗯。
好，我们继续这个第三十六页，刚刚到这一页，我们再往下看。
嗯错了，方向弄错了。
好，再往下。
对，这一页这一页的标题写的是blocks，hello，kitty，before，me。
form。
注意我们先看下一页，这边有个cos，dk。
所以我们现在其实在进行到哪里而已？
整个课程从一刚开始到现在我们才进入了这个是启动嘛启动代码里面进行了keep，inflation。
好，然后第二个相同层次的动作，第二个是I、O、I、N、I，T。
这里面由于。
你有这一行的动作，我现在把那一行抄出来了。
分配内存，以至于我们所以使得吸引了我带你去看这些函数。
这就是前面所讲的，几乎讲了两个小时的内容都是这一些东西之后又退回来下一个相同层次，我说有一、二、三、四、五、六、七、八、九，有九个动作嘛，前面讲过了啊，下面的动作你看一、二、三、四做什么事情呢？
get，command，line。
command是一个字符串。
get，environment，string，引发。
commission是一堆字符串。
ct，A、R、G，V，R、G，M，set，environment。
这四个函数我把它圈起来的话就是都在出。
字符串，他要处理字符串，想必他需要分配内存，所以我就设了中断点，设的断点B，home。
去看看接下来接下来是什么意思。
从这里从这里往后一直到进入面之前，我的标题是这么写的，before，me。
这里分配的内存我设了断点，去看它的长度，看能不能和我们前面的呃理论。
那其实也不是理论，是看了代码之后整理下来的心得，是不是能够伤的一定要相吻合，不然就说不过去了。
好，现在这个先回答刚刚那一夜来。
这是我的例子，在执行的时候的十个环境变量。
怎么谈到环境变量呢？
因为刚刚这个启动代码里面有处理环境变量。
investment。
three。
所以所以我特别关注我当时的环境变量是什么样子。
如果不知道环境变量是什么呢，在上网去查一查，这不是我们现在的重点，我们只要知道这是一一堆很多个字符串有多少个，以及字符串内容是什么，取决于你当时的状态。
好，首先左上角有一段文字说这个东西绿色的这个这是个变量，它是一个pointer，to，point，table。
这根指针这根指针指向的是一个指针所形成的。
有听起来有点绕口啊。
这个表里面的每一跟MC就没比东西，然后里面的每一个元素都是都是什么H to S，T，这个是string，表现出一个环境变量啊这个用我是最喜欢画图的人呢，把这个东西表现出来，就是下一页这种状态。
你可以说。
再回到上一页，来看一下这一个是什么？
它是一根指针啊指向指针表啊。
好，看这个图，有一根指针，刚刚那个名字叫下划线引发什么？
指向一个表。
这个表里面每一个都是指针每一个指针指向上面也说什么指向字符串，所以我画成这样，那字符串最后一定是一个零嘛？
在C一和C加加里头就只剩最后一定是零，所以我画成这样，每一个字符串代表一个环境变量，这是这一页的内容呃这一段的内容。
好，那在我的例子里面环境变量有哪一些呢？
这个都是可以你在你都是可以去去去去找找出来的，所以我当时就把它找出来了，这一个变量首先这个变量是怎么来的？
是在从怎么突然出现这个变量呢？
我们回到前面一卡。
开始我在讲启动网的时候。
启动嘛。
好，这里这是第十三页，你看启动嘛。
里面有分重要的九个动作啊，其中第八个动作这个没有对的，非常齐。
七、八，我看看啊，二、三、四、五、六、七啊。
七是c、i，n，i，t，八是这个调用面，这个有点跑掉了。
八是调用面。
好，我要您看的是这个面有三个参数，我这边特别请你注意。
copy，commit。
你可能会想我写的面里没有三个参数。
嗯我也许根本就没有注意过这件事情，所以我的面是没有参数的。
很多人写测试程序他也不接受这个啊，所以它是零的参数。
那如果我写零个参数在这里，却用三三个实参调用我，那怎么办呢？
不是会出错吗？
这是第一个问题。
第二个问题是现在这是vc的环境，vc特别有这个独特的第三参数，在有些平台上它只有两个参数，叫A、R、G、C和A，I、G、V，所以要不有的是完全没有参数，有的是你这个到底标不标准呢？
在不同的平台只有两个参数，你这是三个参数，我说都可以，因为请你注意空了。
C，ms，柯林坎边去在前面有提到这个呃不是这一页呢，那你得上网去查了，查什么M，boring，company是什么？
是C还是pass？
care，还是stand call，还是faster call？
你去查，你就会得到这个答案啊，答案是什么？
结论是什么？
就是这些参数都无所谓，零个、一个、两个、三个都可以。
好，我怎么跑到这里来呢？
因为我要讲这个变量叫引发热门。
第三个参数。
好，我们现在回到刚刚那边。
好，这个就是这个。
那这一个我去观察他的地址，在这边抄下来了。
在当时我观察是这样，这个就是这一块，这里这里啊，这些图隐藏了很多的细节，请大家特别注意。
我们一定要把它走一遍啊，心才踏实。
这个变量就是一根指针指向这个位置，这个位置这个位置说里头其实都是一堆指针指向一堆的字符串，所以这里啊一定是一堆指针，到底最后是几真的到底有几个呢？
最后以零结束。
所以你从这边开始。
仔细的看，最后以零结束，在这个位置上，这里可见这个之前都是指针，这里有四个零嘛，之前那这里有几个指针呢？
四个字节是一个指针，一、二、三、四、六、七、八、九、十。
所以现在在我的例子上，有十个字符串代表十个环境变量，它的起点都被登记在这里，你可以看一下我下一页画的图，这个你就会很有感觉。
好，回到这里来。
所以这里有十一个指针呢，也就是十个地址，我就把他全部找出来它的内容。
像这个这个应该倒过来看呢，所以是零。
零，七d零、b a零就是这个地方，零。
零，七d零，b a零。
我这些线条都帮你拉好了，这边黄色这一块圈起来，这是第零个第一个零，一二三四五六七八九啊我这边都拉出来了，可以仔细去比对这九个指针，也就是九个地址的起点。
在这边，仔细看这个这个这个这个这个这个这个。
每一个起点，接下去就是一个字符串。
代表一个环境变量，好，去观察的结果。
那这边有人类看得懂的东西在这里，这边是人类看不懂的，这是看得懂。
所以第一个环境变量叫tmp，等于就是说啊第二个叫t、e、m，p等于不不不，第三个叫promote，第四个叫叫什么win，book，顶等等等等等。
我我我观察这些做什么用呢？
我要知道它的长度，我相信好，这是当时我在观察的时候，我就在想，接下来我去设定断点，我一定可以看到相对应的这一种长度的内存分配好了。
这边我都已经把长度算出来了，这个长度怎么算？
因为这些都是字符串，所以你只要找出我已经被我圈起来这些零就是字符串的尾巴啊，这样就可以算出来这个长度，找一个最短的。
来，看，好了，这一个啊这是第六号。
你看这个铃铃被我圈起来在这里吗？
所以它的长度是多少呢？
上面有八个字节，这第九、十、十一、十二那个长度是要加上最后的零啊，所以这个是十二长度十二，以此类推啊，各位仔细的看一看。
比如这个。
再看一次。
好了，这比较大，这横的是八个字节，总共是零。
零，在这里看起来像AA啊这个。
只是切得不够好，所以总有几行呢？
一、二、三、四、五、六、七、八、九、十。
十行，一行是八个，那就是八十个八。
一八二八三，这里长度是二十三。
那这一个呢实在是太长了，我当时屏幕截图呢反正反正这个图上现在没有显示出那个结束的零啊所以我不知道长度，反正很长。
我这边想打一个问号。
ok，有了这样的环境变量之后，我开始设断点啊，我开始观察。
哎我们来我们来看看啊这个图怎么看。
这边是cost，down。
从下往。
嗯注意，从下往上曾经分配内存的，我们的M在这里。
哦他到了这个地方才掉上面。
网上还有呢？
我们也画出来了。
翻面之前，标题说了，before me之前，所有的内存分配我通通被我观察到，往右边拉，它的大小都能抄出来。
我们一个一个来看，首先是这个I、O、I、N、I，T，我们前面花了几乎一个半小时啊两个小时在讲的那个第一块的大小还有印象吗？
一。
三零H那个怎么来的？
因为这个行，这个地方发出这个需求是三十二个。
set，of，in，for I，O，info。
这个呢呃前面有出现在这里。
我没有再画一次，这个大小是八，所以三十二乘以八就是两百五十六，两百五十六是一个，他要的真正的大小，还要再加上第八个黑的上面八格，下面一格，所以总共是三十六。
四、九。
三十六加完了就是这一个，我把它变成十六进位，就是这个紫色的一、二、四。
诶这个图是这样看，所有紫色的部分都是加完加了三十六，你看后面每一个都是这样。
加了三十六之后十六进位值之后还要再加上下cookie，然后我画这个箭头表示要上调到十六。
天气，我们前面不是一直在讲这件事吗？
我们现在只是照做而已。
所以一、二、四你每一个希望你都走一遍啊，都算一遍、看一遍。
这个加完之后是一、二、四，七加八，再调到十六的边界就是一、三、零，你要用十，习惯十六进位的加法，你这个才会快。
你看啊，一二四加八九一二七、一二，C调整就是一三零，是非常快的。
一三年啊一三年应该是第十八号链表来服务，不过当时我们前面已经看过了，十八号列表是空的，所以才有后我们刚刚讲的那一大堆的故事。
第一个动作好，完成了之后再往前往下看。
时间往下，这个图要往上。
好，这边有一个get。
investment。
three，a is f。
t的意思。
真正调用是这个函数。
这一个函数里面我就不再挖源代码给你看了啊。
他第二他分配了这么多。
这么多，要加cookie还要调到十六的边界，就这么多。
二四零h。
后面这个刮胡就是他理当原本应当啊最刚好的话应当由哪一号链表来提供服务？
这每一个我都有算出来，你都要经历一遍。
那我要解释为什么他在这个地方要要求这么一大块这这个这个长度的是什么意思。
我们可以这样想啊这样说啊，回到上一页来，这些环境变量其实是在一个操作系统的角度，操作系统的手中掌握的十个环节、十个字符串。
现在到了这一段代码，eval，matching，他要把操作系统手上的那一堆全部拷贝过来，分成十个字符串。
那十个在操作系统手中现在要拷贝过来，所以他这边分配了一大块。
那这一大块是多少呢？
想象中回到上月来，应该要是这十个环境变量的长。
加起来，就算不是刚好，也要差不多。
那怎么不是刚好呢？
那那可能要膨胀了，要加上后面那个零，就是一些细碎的东西啊，确实是如此。
你把这些长度加起来就差不多就是二十三点七，但不是刚好。
好，然后经过这些又是膨胀，又是调整了，就是二四零零七啊这是第二次测的断点，确实看到了这个结果。
再往下图是往上看，设一个ig，V，什么是二？
什么是卡梅呢？
命令啊。
长的啊给我们在现在这个执行呢这一次执行命令行是这么长。
仔细的算，我希望你也算一遍，把这个每一个都算一遍。
一个二十七的呃字就是一个自己，我这边已经算好结果了，以上有五十五个字符，所以长度是五十六，因为后面要加零嘛，长度是五十六。
那这一种R、D、A、R、G、V，它是什么格式？
它的格式由于A、R、G、V啊也是可以有很多个字符串，我们现在这个例子只有只有这一个，就这一个实际上可以啊在不同的例子里面可以有。
很多个，所以而是也是这样。
只不过现在是这边只有一个指针，只下了一个字符串这个的简化版。
所以所以整个的长度是多少？
只有一根指针呢这个这里有十根指针啊，但是在现在这个情况，实际例子中只有一根指针加上一个零一根指针加上一个零，而这根指针所指的字符串就是上面这一堆。
好，我们算算它的总长度是多少。
这是四个字节指针嘛，这是零，也是四个字节，就四加四加上这个长度刚刚已经算好了啊，我但愿你自己也数一遍，是五十六，所以四加四加五十六长度是六十四。
十进位的六十四。
六十四要膨胀，在调试模式下要加三十六，就是一百，这是膨胀之后的一百，就是这里所观测一百。
一百是什么？
这里观察到六。
四H就是一百，这里的一半线条都拉好了。
这个六十四A，H，就是这个一百。
啊我们非常高兴。
诶。
这个确实能够验印证这些数据。
刚刚只是膨胀而已。
哦加了三十六只是膨胀啊，所以还要再加八，就是上下铺地，还要再调到十六的边界。
实际上拿到的那一块内存快是七点而去。
好，这边又结束了，再往上看。
S，environment，P，刚刚说这个get environment，这边拿到一大块，现在sz，investment就是要把这一大块其实就是商业的四十个字符串要把它切干净，不是切干净来把它切开来。
所以这边这个图是这样看啊，继续往上。
画不下去了，所以这个线条就这一个函数引发了这些动作。
注意这个线线条箭头这样往上，它引发了十一次的内存分配。
算一下，一、二、三、四、五、六、七、八、九、十、十一，怎么会是十一次呢？
十个环境变量加上一个这个table，因为他从操作系统拿到了这一大团团的环境变量，它要把它分开来吧，分成这一个结构，这一个结构就是十一块内存。
这里有十块，加上这一块总共是十一块，就是这个。
好，我们一个一个来看啊，这里有十个字符串，所以需要十根指针加上最后的零。
好，都能够算好了。
十一乘以十家，最后面这个就是十一个乘以四，每一个字指针嘛四个字节加完之后要膨胀，就是第八个mod要膨胀。
这都是在第八个沫之下观察的。
加三十六就是八十十进位的八十。
好，到这边来。
这一个长度就是因为这个箭头这样子看，所以第一次分配就是这一个。
你看，四十四加三十六，就是这里的四十四加三十六啊这是八十，也就是十进位的呃十六进位的。
五。
零h。
好得到的东西，我们还要加cookie，再调整到石油的边界啊所以是六。
零的区。
各位，你一定要像这样，不要说十个好了，十一个好了，你至少要看过五六个绝对有帮助，心里头那一张大局观那个图表就会来落定，依此类推。
怎么样推呢？
这些数据代表什么意思啊？
这里有十一次的分配，那这个分配已经。
解释过了，接下去就应该是十个字符串，十个环境变量。
我们来看看上叶，这里有长度啊，我看我能背几个啊？
二十二、一、十二、二、二，我只能背四个，背不下去了。
再一次，二十二、一，十二、二、二，二十二、一，十二、二、二，以此类推，你上下页反复看，就是把这十个长度抄到这里来，这是字符串的长度，每一个都要经过蓝色，也就是膨胀调试模式下的膨胀。
变成，那么紫色是十六进位的，是要释放，再加八cookie，再调整到十六，边界就变成这个绿色的。
这一堆完全吻合只有一个，不能说完全吻合了，因为上一页这一个长度其实我不知道其他的完全稳，这个不知道也不表示不吻合，只是我当时没有留下记录而已。
所以回到这里来，所有这些通通都能解释。
哈哈事实上这里所出现的数据，也就是我们在前面，你看前面，我为大家。
解释这些内存的首次分配，第二次、第三次一直到第十四次都是分配。
这些数据都是从刚刚那个实际观察取得的。
看一次啊，这个是一三零一三年，再来是二四零啊，被抢一三零二四零，再来是欺凌一三零二四零七零。
我们看看刚刚。
你看这个一、三、零第一次再来呢，二、四、零，再往上呢，七。
零，在我的。
那从管理那个课程里面呢，我就列的不只是三次啊，还有很多次，完全就是这些数据。
好，所以我们解释了一些什么。
从这里开始，这个一直往上，一直到这个比较大的，这一堆十一次全部都解释完了，都很棒的数据。
接下来有一次服役，这就是前面拿来做例子的第十五，再看一次前面。
第三、第十四，我没有发出来，我没有列在这个投影片上。
第十五次释放释放多少？
这个图要看是释放的，是不要弄错，我得开。
谢谢。
嘿四方应该是二。
四。
零吧，这一块我画成这样，四方二十四位。
我们去看看。
到这里有一次服役长度果然是二十四位。
而这个二。
四零是因为这个地方分配了一大块，我们在再复习一次。
这是什么这是我们的程序，要一大块内存，准备从操作系统手中把所有的环境变量拷贝过来，所以要一大块。
而是他现在功成身退，他已经被切割成十个字符串了，所以这个二。
四。
零可以还了。
就是这个。
好，所有这些这么多动作呢总共十次十一次的分配以及一次的释放。
那是在执行到这里了，继续往下又可以观察到一些。
然后注意这边，before，me。
啊现在终于完成了，要进入面。
你可以想象这时候的那一个是所谓的S、D、H小区块的那个系统的管理，就是那六十四条链表那些东西啊在进入面的时候他可能已经是什么状态了？
这个就没有一定啊但是没有一定成为什么状态，但是你可以想象，它可能已经有些链表有挂着一些取款，然后还有什么八大筷子之类的。
并不是如你也许一开始所想像说啊，还没有进入M刚进入面的时候，大概整个就是一片平坦如海，一片空虚的，什么都没有的一种状态，其实不是这样。
啊啊好，我们来看看这里。
进入M之前，C、R、T已经做了许多工作，就是这一些工作，这些其中需要若干内存。
因此方面，首次调用M lock的时候，如果你进入面里开始开始调用没了，其实已经有若干内存块挂在S、D、H所维护的自由链表上头了，就我刚刚所说的。
当然它是一个什么状态就是没有一定什么状态啊，但是你可以想象那种景况。
好，这是我们利用我们也也可以说很开心的啊。
由于看到呃呃这个叫star call的这些内存的处理，而不是字符串的处理，使我们可以很详细的验证每一个数据的由来。
这边就告一个段落了，接下来要谈的是就要带大家去看看V C十这一页其实前面已经出现过。
他的长相已经不太一样了。
那个所谓的sd。
h不借，注意这句话其实都在，只不过深深地埋到做操作系统层面去。
所以我会整理一个单元叫做windows。
seven，management。
这时候没有源代码，但是让你看看那些cookie其实也是在，那些链表其实都在，这是我们接下来的主题。

</code></pre> <div class="line-numbers-wrapper"><span class="line-number">1</span><br><span class="line-number">2</span><br><span class="line-number">3</span><br><span class="line-number">4</span><br><span class="line-number">5</span><br><span class="line-number">6</span><br><span class="line-number">7</span><br><span class="line-number">8</span><br><span class="line-number">9</span><br><span class="line-number">10</span><br><span class="line-number">11</span><br><span class="line-number">12</span><br><span class="line-number">13</span><br><span class="line-number">14</span><br><span class="line-number">15</span><br><span class="line-number">16</span><br><span class="line-number">17</span><br><span class="line-number">18</span><br><span class="line-number">19</span><br><span class="line-number">20</span><br><span class="line-number">21</span><br><span class="line-number">22</span><br><span class="line-number">23</span><br><span class="line-number">24</span><br><span class="line-number">25</span><br><span class="line-number">26</span><br><span class="line-number">27</span><br><span class="line-number">28</span><br><span class="line-number">29</span><br><span class="line-number">30</span><br><span class="line-number">31</span><br><span class="line-number">32</span><br><span class="line-number">33</span><br><span class="line-number">34</span><br><span class="line-number">35</span><br><span class="line-number">36</span><br><span class="line-number">37</span><br><span class="line-number">38</span><br><span class="line-number">39</span><br><span class="line-number">40</span><br><span class="line-number">41</span><br><span class="line-number">42</span><br><span class="line-number">43</span><br><span class="line-number">44</span><br><span class="line-number">45</span><br><span class="line-number">46</span><br><span class="line-number">47</span><br><span class="line-number">48</span><br><span class="line-number">49</span><br><span class="line-number">50</span><br><span class="line-number">51</span><br><span class="line-number">52</span><br><span class="line-number">53</span><br><span class="line-number">54</span><br><span class="line-number">55</span><br><span class="line-number">56</span><br><span class="line-number">57</span><br><span class="line-number">58</span><br><span class="line-number">59</span><br><span class="line-number">60</span><br><span class="line-number">61</span><br><span class="line-number">62</span><br><span class="line-number">63</span><br><span class="line-number">64</span><br><span class="line-number">65</span><br><span class="line-number">66</span><br><span class="line-number">67</span><br><span class="line-number">68</span><br><span class="line-number">69</span><br><span class="line-number">70</span><br><span class="line-number">71</span><br><span class="line-number">72</span><br><span class="line-number">73</span><br><span class="line-number">74</span><br><span class="line-number">75</span><br><span class="line-number">76</span><br><span class="line-number">77</span><br><span class="line-number">78</span><br><span class="line-number">79</span><br><span class="line-number">80</span><br><span class="line-number">81</span><br><span class="line-number">82</span><br><span class="line-number">83</span><br><span class="line-number">84</span><br><span class="line-number">85</span><br><span class="line-number">86</span><br><span class="line-number">87</span><br><span class="line-number">88</span><br><span class="line-number">89</span><br><span class="line-number">90</span><br><span class="line-number">91</span><br><span class="line-number">92</span><br><span class="line-number">93</span><br><span class="line-number">94</span><br><span class="line-number">95</span><br><span class="line-number">96</span><br><span class="line-number">97</span><br><span class="line-number">98</span><br><span class="line-number">99</span><br><span class="line-number">100</span><br><span class="line-number">101</span><br><span class="line-number">102</span><br><span class="line-number">103</span><br><span class="line-number">104</span><br><span class="line-number">105</span><br><span class="line-number">106</span><br><span class="line-number">107</span><br><span class="line-number">108</span><br><span class="line-number">109</span><br><span class="line-number">110</span><br><span class="line-number">111</span><br><span class="line-number">112</span><br><span class="line-number">113</span><br><span class="line-number">114</span><br><span class="line-number">115</span><br><span class="line-number">116</span><br><span class="line-number">117</span><br><span class="line-number">118</span><br><span class="line-number">119</span><br><span class="line-number">120</span><br><span class="line-number">121</span><br><span class="line-number">122</span><br><span class="line-number">123</span><br><span class="line-number">124</span><br><span class="line-number">125</span><br><span class="line-number">126</span><br><span class="line-number">127</span><br><span class="line-number">128</span><br><span class="line-number">129</span><br><span class="line-number">130</span><br><span class="line-number">131</span><br><span class="line-number">132</span><br><span class="line-number">133</span><br><span class="line-number">134</span><br><span class="line-number">135</span><br><span class="line-number">136</span><br><span class="line-number">137</span><br><span class="line-number">138</span><br><span class="line-number">139</span><br><span class="line-number">140</span><br><span class="line-number">141</span><br><span class="line-number">142</span><br><span class="line-number">143</span><br><span class="line-number">144</span><br><span class="line-number">145</span><br><span class="line-number">146</span><br><span class="line-number">147</span><br><span class="line-number">148</span><br><span class="line-number">149</span><br><span class="line-number">150</span><br><span class="line-number">151</span><br><span class="line-number">152</span><br><span class="line-number">153</span><br><span class="line-number">154</span><br><span class="line-number">155</span><br><span class="line-number">156</span><br><span class="line-number">157</span><br><span class="line-number">158</span><br><span class="line-number">159</span><br><span class="line-number">160</span><br><span class="line-number">161</span><br><span class="line-number">162</span><br><span class="line-number">163</span><br><span class="line-number">164</span><br><span class="line-number">165</span><br><span class="line-number">166</span><br><span class="line-number">167</span><br><span class="line-number">168</span><br><span class="line-number">169</span><br><span class="line-number">170</span><br><span class="line-number">171</span><br><span class="line-number">172</span><br><span class="line-number">173</span><br><span class="line-number">174</span><br><span class="line-number">175</span><br><span class="line-number">176</span><br><span class="line-number">177</span><br><span class="line-number">178</span><br><span class="line-number">179</span><br><span class="line-number">180</span><br><span class="line-number">181</span><br><span class="line-number">182</span><br><span class="line-number">183</span><br><span class="line-number">184</span><br><span class="line-number">185</span><br><span class="line-number">186</span><br><span class="line-number">187</span><br><span class="line-number">188</span><br><span class="line-number">189</span><br><span class="line-number">190</span><br><span class="line-number">191</span><br><span class="line-number">192</span><br><span class="line-number">193</span><br><span class="line-number">194</span><br><span class="line-number">195</span><br><span class="line-number">196</span><br><span class="line-number">197</span><br><span class="line-number">198</span><br><span class="line-number">199</span><br><span class="line-number">200</span><br><span class="line-number">201</span><br><span class="line-number">202</span><br><span class="line-number">203</span><br><span class="line-number">204</span><br><span class="line-number">205</span><br><span class="line-number">206</span><br><span class="line-number">207</span><br><span class="line-number">208</span><br><span class="line-number">209</span><br><span class="line-number">210</span><br><span class="line-number">211</span><br><span class="line-number">212</span><br><span class="line-number">213</span><br><span class="line-number">214</span><br><span class="line-number">215</span><br><span class="line-number">216</span><br><span class="line-number">217</span><br><span class="line-number">218</span><br><span class="line-number">219</span><br><span class="line-number">220</span><br><span class="line-number">221</span><br><span class="line-number">222</span><br><span class="line-number">223</span><br><span class="line-number">224</span><br><span class="line-number">225</span><br><span class="line-number">226</span><br><span class="line-number">227</span><br><span class="line-number">228</span><br><span class="line-number">229</span><br><span class="line-number">230</span><br><span class="line-number">231</span><br><span class="line-number">232</span><br><span class="line-number">233</span><br><span class="line-number">234</span><br><span class="line-number">235</span><br><span class="line-number">236</span><br><span class="line-number">237</span><br><span class="line-number">238</span><br><span class="line-number">239</span><br><span class="line-number">240</span><br><span class="line-number">241</span><br><span class="line-number">242</span><br><span class="line-number">243</span><br><span class="line-number">244</span><br><span class="line-number">245</span><br><span class="line-number">246</span><br><span class="line-number">247</span><br><span class="line-number">248</span><br><span class="line-number">249</span><br><span class="line-number">250</span><br><span class="line-number">251</span><br><span class="line-number">252</span><br><span class="line-number">253</span><br><span class="line-number">254</span><br><span class="line-number">255</span><br><span class="line-number">256</span><br><span class="line-number">257</span><br><span class="line-number">258</span><br><span class="line-number">259</span><br><span class="line-number">260</span><br><span class="line-number">261</span><br><span class="line-number">262</span><br><span class="line-number">263</span><br><span class="line-number">264</span><br><span class="line-number">265</span><br><span class="line-number">266</span><br><span class="line-number">267</span><br><span class="line-number">268</span><br><span class="line-number">269</span><br></div></div><h2 id="_10-heapalloc-角色与影响"><a href="#_10-heapalloc-角色与影响" class="header-anchor">#</a> 10. <code>HeapAlloc</code> 角色与影响</h2> <h3 id="ppt-windows-heap-management"><a href="#ppt-windows-heap-management" class="header-anchor">#</a> PPT.Windows Heap Management</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211126092646.png" alt="image-20211126092645424"></p> <p>嗯嗯。好，我们可以利用这张图呢对于这个windows的Heap有个大致的了解。</p> <p>现在我要带各位啊做一些实验，来看看它里面的一个活动过程。</p> <p>嗯<strong>我们要抓出来的是它里面是不是具备前面我们所学到的那个</strong>。所以==S、B、H==，我希望你把这个名词已经记在脑袋里头了啊。的那些动作的关键部分，如果这里可以展现出那些关键的特性，<strong>我们就说啊那一堆东西其实被搬到操作系统层面来了</strong>。</p> <h3 id="ppt41"><a href="#ppt41" class="header-anchor">#</a> PPT41</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211126093010.png" alt="image-20211126093008665"></p> <p>我这边要做的动作，刚刚这边说这些区块是怎么来的。HeapCreate取得的，跟操作系统要的，我现在就这么做。C，Ca这个就是它的默认值，但是我已经讲过了，这个词其实无所谓，反正他会膨胀嘛，无所谓。</p> <p>我得到了之后呢，我现在要告诉你我现在要告诉你这个拿到的这一个kindle，在windows底下都是叫拿到一个kindle、fire。
kindle或者说Mary baker呃很陡气魄的很斗啊，句柄熨斗。
这个黑洞到底是什么意思呢？
把它打印出来看打印出来看这个现在这个值是三九零零零零，看起来像是一个地址，它的确是一个地址。
于是我现在带你去看看三九零零零零打印出来这个地址，我们看看能有没有什么我们认得的东西。
好啊，我要告诉你一个是事实啊，你现在。
哎呀问我这个事实我是怎么知道的？
呃那我我不在这里解释，因为本来这个windows系统呢可以是要可以录成另外一门课，可能要五六个小时啊，那边就会有详细的解释，但现在不谈，我只告诉你一个西部的下在第一百七十八个呃一百七十八号在这个地方，在offset偏移值一百七十八个字节的地方有着一堆东西，什么东西呢？
一百二十八调free，list，一百二十八条自由链表，这个自由链表是双向链表，我现在带你去看。
这个是三九零零零零，就是西北的起点，在第一偏移值一。
七八的地方。
对啊，这边右边有一些仪器。
啊，那就是三九零一七八啊我们去看这里，就是三九零一七零，就从这里开始那么七、八呢就从这里开始，我已经帮你圈起来了，红色的这一块下面还有这边写了，总共有一百二十八个双向链表双向链表那双向链表是以两根指针合在一起，叫做双向链表嘛，电表铜。
所以从零一七八开始啊那么它结束于什么地方呢？</p> <h3 id="ppt42"><a href="#ppt42" class="header-anchor">#</a> PPT42.</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211126093059.png" alt="image-20211126093057007"></p> <p>我们看下一页啊，记住这个，现在我们应该去看三三九零一七八。
好，我们去看下一页，这里就是三呃好三九零一七零嘛，所以这里就是。
一九零一七八，注意黑色的这个地方，从这个地方开始，总共有多少呢？
上一页告诉你有一百二十八条双向链表，我们来看看它的尾巴在哪里。
呃这样算一百二十八个free list，也就是一百二十八对指针，那么起点是零一七八加上这一个，这是一百二十八对指针嘛，一对就是两个啊，所以一对指针就是八个字节，一、二、八乘以八，这样加起来是多少呢？
用十六进位加法会比较快，也许你不熟悉，来其实我也不是那么熟悉了，但是我为了要讲课啊，我事先都已经整理过了啊。
一二八乘以八就是一K，就是一零二四一零二四，这十六进位就是四零零四零零。
所以把这个起点加上四零零，那就是三九零一七八加四零零就是三九零五七八。
好，三九零五七八在哪里？
知道这个位置，所以这是一个连续的内存内存的表现啊。
从这边各位应该停留下来呢，仔细的看一看，从这里一直下去然后到这里一直下来到这里。
所以这个从黑色这边起点一直到这个，总共是一百二十八个自由链表。
啊我们在前面vc六谈SD趋势的时候，说他为了要做管理，它有六十四条自由链表啊有三十二群，每一群有六十四条。
自由链表啊，当时我但这一个课程里面我并没有解释为什么是三十二群啊，但这个我说要简化嘛，这已经不不影响我们的理解了。
好，那边有六十四条，这里有一百二十八条，ok。
每一条自由链表好，应该去指向一些区块，可以拿来供应给客户。
每一条自由链表的任务是什么？
他自己应该负责多大块呢？
在前面的sb、h那个系统里头，还记得吗？
啊是以十六为间隔的，呃第零条负责十六个字节，最后一条负责的是呃乘一下吧，就是一k。
而在这里呢，每一条链表他的负责他们。
责任区间是八个字节，只是设计上有一点不同啊。
所以这一个就是现在灰黑色圈起来，这个就是第零条链表的内容，这个内容我把它放大抄到呃错了，下一页下一页在这个地方啊所以等一下我们就就去看这一页这一块了，再回到上一页来，这个内容，这个内容其实是两根指针，所以我要带你去看这两根指针拉过去它记录了什么东西？
我们现在来看看，这两根指针呢内容是这样颠倒过来看，所以是零。
零三九呃一一一一a零，这里就是零。
零。
三九一一a零，我去找了这一块内存出来，他办不出来。
看看内容是什么。
所以这边画了线蓝色的线条，表示这是一根指针，直到这里来。
那么这是一对指针，它的第二根指针呢内容一样，也是零。
零三。
九。
一亿a零，所以所以它也应该是指到这里来。
好，我要带你去看这一块，看看我们能能不能解释啊这个第零条自由链表或者叫第一条自由链表，为什么他拉过来这里到底是什么？
能不能解释他？
我把这一块也放大，我们看下一页，我把它抄到这里来了，零零三九一一a零。
啊所以我们现在来看这一页。
看看怎么去解释这个内容。
如果我能够找出我们在sd h里面呃熟悉的那些东西，什么cookie啦cookie，然后下面接着两根指针，还记得吧？
这个我就不再重讲了，我们才刚刚谈过去，花了两个多小时谈的。
如果我们能够找到对应的这些关键结构，我们就可以说哦这两个设计其实是一样的。
好，我们过去看看看看我这边所画的图。
这里有，这是第零，你看我这边写诶free零就是自由链表第零条，总共有一百二十八小啊一百二十八。
对，那么这就是f零，free零就是这一个。
我把这个值，这应该是两根指针插到这里来，蓝色和红色的我都是照着这个内容来抄过来的。
那么这个是福利一，这就是接续下面这个了，我们看看。
零零三九零一八零，我抄过来了，零零三九零一八零。
第二个也是零零三九零一八零，我也把它抄过来了。
那么在下一对指针呢是零零三九零一八八。
我也抄过来了。
然后我们看看这样代表什么意思。
所以这个这三对绿色的这三对指针就是从这里抄过来的。
好，根据这些指针。
所指的它这个指针的数值。
我画成图呢我们可以感受到，第一条自由链表上第二条自由链表都是指挥指向自己，表示这是一个空的列表，这个也是空的。
下面点点点呢画出来的图都一样，表示都是空，链表不挂任何的自由区块。
所谓自由区块就是可以切割出去给客户用的。
只有第零条，就是最前面的这一条。
根据抄出来的结果，我们发现这些指针呢它不再是指像这样子指挥自己，不是，他只只到了这个地方来这抄过来的嘛。
是。
零零三九一一A零嘛。
啊我就去看看零零三九一一A零，把这个内容呢抄出来，画成这个。
那你看一遍呢，零零三九一一A零在这个地方啊，它的内容呢这里是零零三九零一七八，抄下来，这个就是零零三九零一七八，再这样子抄下来。
但是它的前头现在我画成黄色的这一块，也就是这个的前头有八个字节，我也把内容抄过来。
这里这里，二一零二零零零三二一一零二零零零三，达到八八八八，照抄过来八个字节。
好，你有没有感觉到这个油？
很熟悉的一种一种布局？
是的。
黄色的这一块就是所谓的cookie，我们在前面vc六里面看到的那个哎D、H里面的每一块啊每一块切出来都是这种长相啊，上下都有带cookie，然后上C皮的下头呢有两根指针。
你看这个布局，这是windows一下系统的布局，和这个字非常类似。
我怎么我没有说它完全相同，我说它非常类似哈，因为这个cookie在D。
H这个。
这个系统里头vc六的这个系统里头，这个cookie记录的只是长度而已，但是在这个地方它记录的是这么多，它的意义是这样啊，这边都写得很清楚了，蓝色的这个这个纸，用人的眼眼睛看，应该是倒过来看啊。
所以是零。
二。
二d这一块这个记录的是这一块的大小，但是他后头还有一个这个紫色的零三、零三，记住意义是什么呢？
是前一块的大小，而他并后头并没有泪，并没有相对应的这种东西，没有相对应的cookie。
也就是说在前面这个系统呃呃不是叫前面，在vc六，s、e、h的。
系统里面呢每一个区块有上下空气，但是在windows这个系统里头呢，只有上顾忌，没有下顾忌。
而这个上裤体由于这里有一个数值已经表现更上一块的大小，所以它可以做上下融合。
哎还记得吧？
这个上下cookie作用啊，可以可以在回收的时候做上下融合。
所以虽然布局略这两块啊布局略有不同，但是功能是相同的。
这时候你应该停革下来，好好的去想我画的这些图，每一个意义画这样子，对不对？
就是线呃这个线上课程的好处嘛，你随时可以。
停下来想一想。
所以我要继续下去了。
从这个地方，我们几乎我们已经可以判定，整个S、B、H的那个管理的被挪到windows以下。
呃幸福的管理人怎么说呢？
呃先前是有六十四条链表，现在是一百二十八条链表，先前的每一个内存区块呢有固体、有指针，靠着这三个就可以表现出一整块。
现在您也看到了，这里也有cookie，也有指针，靠着这个就可以表现出一块一整块内存那种快。
这样这是最关键的地方啊，我们已经可以确认。
但如果我们能够看一次它的变化，这个我们心里呢会更有好，先把这还还有少数没有解释的地方呢再把它讲得更清楚一些，哪些还没讲呢？
到底这个cookie在以前sb。
h里头这边只记录长度，但这个地方却有这么多，有没有办法全部去解析它呢？
呃这就要另外的课程去谈了啊。
但是这里我刚刚已经提过了，前面这两组数字蓝色跟紫色的这两组数字紫色这个表是浅一块，可是目前这个就是第最刚开始的一块，这个叫手区块。
first手区块手区块它并没有更前面的一块，所以在这种手区块里头的cookie的这一段数字的意义比较不一样啊，它并不是指前一块的大小，这有特殊意义。
什么特殊意义？
现在就不解释了。
嗯另外这里的说这一块自己的长度是这个换成这样是零。
零二二。
一，单位是什么？
在以前这里cookie记录的就是字节整块的大小，但是这个地方这里的单元是字节，这个地方的单元每一个的单位长度是多少呢？
是一个呃我在这里叫做一个单元。
所以二二d不是自节树，是单元数。
呃这边长度是以单元为计算，每一个单元是八个字节。
这是他跟它和这个s、e、h系统呃不一样的地方，它的单元是一字节，它的单元是八字节。
这个可以带来一些好处啊啊仔细体会这句话。
仔细品味这句话，我们以前在sd h里头啊，如果说回收一个哈，五十六个字节好了，五十六合不合适？
我也不能乱乱。
乱讲一个数字啊，这个因为它一定是十六的倍数，所以我说六十四。
好了。
如果回收一个六十四个字节的长度，我们必须去计算它是六十四，要除以十六减一才是这个归属于一。
起号链表现在在这个地方，由于它的每一个单位是八个字节，所以如果回收的时候这里呃回收呃呃这边cookie记录的是七。
七个单元啊，那这个七。
七个单元一定回归已经被回挂到第七号链表，总共有一百二十八条链表，一定是回归到第七号。
这个你想一想，你仔细想想这一段文字你可能一下子体会不过来，这个需要时间想。
所以其实是换汤不换药啊呃换汤不换药好像在我们口语里面说这是一个不好的事情啊哎呀你做事情换汤不换药等等。
但是在这里没有负面的意思，它就是整个的设计的这个原则是完全一样的。
在S、B、H、V、C六的这个系统，它现在vc十之后的这个系统其实是完全相同。
现在我带你看，这是初始状态，我们从这里挖一块那种我们客户啊写应用程序的，或者说C、R、T啊，从这里要挖一块内存出来，它的变化这样就会更。
不清楚了。
好，我们看下一页。
现在我做什么事情呢？
我这边画了一条线，我做的事情在这里，内存的bug，呃把请印出来看都在这个地方，我想看的都把他抓出来在这里啊画成图是这样，其实各位可以这是一个很好的呃学习的过程啊，各位也可以也可以学习这个如何学习的过程，就是你把你心目中的对于技术的理解啊画成图。
因为你在看这些东西，看很多文字终不如你看这个图快，所以各位可以也要试着去学习这种能力。
好，看看我画的这个图的意思。
我说现在这个断点我把它设在这里，所以要看的是锻炼以前的这个动作。
我接续着刚刚的图片，我做了一个share，low，key。
刚刚只是query一条，现在hellokitty要挖出一块空间来，多大呢？
一。
零二。
四。
一。
零二。
四。
我们看看它的变化是什么。
呵这个图这个图是刚刚上一页的，这一块我没有办法按按照比例来画啊，这一块本来的大小是零。
二。
二。
一，被切割了一。
零。
二。
四之后。
它变成了什么样子？
这个图上看得出来是变成了一aa。
好，一aa是怎么算出来的呢？
这里要了一。
零二四，一零二四就是一百二十八个单元，因为一个单元是八个字节嘛，所以一二四除以八就是一二八。
一百二十八，十六进位就是八。
零h，所以这个长度应该是说切出的八。
零h。
但实际上呢由于前面还要有一个cookie也是一单元。
嗯说cookie是八个字节，就是一个单元在这里。
好，把。
白色的这一块加上黄色这一块。
那么由于我是在调试模式下，所以调试模式呢还要加一个tail，一个尾巴，还记得吗？
在以前vc六的s、e、h，如果是调试模式，也要加上一个第八个header，那个时候是header是挂在头部，那这里的设计是挂在尾部。
这个多长呢？
两单元二单元。
所以当我客户要求一。
零二。
四的时候，其实是切割了这里八。
零h加上一加上二，总共是八。
三h。
h十六进位的意思啊，八四。
三这样的单元，这一块就切出去了。
啊为了应付客客户的这个动作。
好，因此我们观察到确实切出去之后的这个cookie这边记录的是八。
三。
刚刚我们已经算过了嘛，八。
零加一加二是没有按照比例画啊，所以总共是八。
三。
非常好，这个数字我们很喜欢，因为符合我们的运算结果。
那下面剩多少呢？
下面这一块的cookie要记录的自己的自己的长度，这个长度是怎么来的？
你我们看看上一页，上个月是二。
二的呀，再看这一页，要把二。
二，一。
现在切出去的八。
三啊，二、二、一，减掉八十三，这都是十六进位啊。
啊拿出纸笔来检检，看得到的结果就是一。
AA，就是这个E，AA。
这边所画的图，并不是我在在这个人工在这边纸笔计算，然后把它抄上去，不是这样，这些数字是从内存的观察去抄出来的。
而这一边是我对他的解释啊，这样两相应对呢能够吻合起来，这才是我们所要的。
好，那么这一块切出去之后啊从这里到这里切出去之后，剩下的这一块剩下的这一块，也就是挂在这个地灵。
好的自由链表嘛，就其他都还没变呢。
一。
零号列表挂的是一开始就是特别大块的，就好像我们前面在讲S、B、H、V，C六的S、B、H啊，它的第它在某一个链表啊，它是最后一个链表，挂的是八大块八大块，类似那样的对等的意义。
所以这个地方现在剩下了啊在cbs所拥有的这个指针，仔细看这个指针这里这是链表头，它指到这里来，呃这一块要拉回到这里，这样就形成一个循环嘛。
啊反方向也是一样，反方向是这个颜色啊，紫色的，它是指向这一块，这一块拉回来。
这一个cookie去观察到内存，把它去完整地抄出来，是这样，其中的零。
一。
a a我抄在这里，后面还有一段是零。
零八三，刚刚在上一页已经告诉你了，这第二段内容指的是上一块的长度，所以我们看现在呢零。
零八三的确是切出去的那一块的程度非常好。
就依此类推，一刀一刀的切出去。
所以下面我们我们已经挖出最关键的部分了。
其实这这个小单元现在进行这个小。
来源就是到底用意是什么？
是告诉你先前我们在vc六看到的SB。
H的设计，在这个地方，windows操作系统内部其实都关键性的部分都实现出来啊到这里已经够了。
所以呀已经达到了我们的目的啊。
呃这个单元呢这是什么味？
我这个整个的实验是在windows X、P、S、P，two这个版本底下的观察结果，我们不需我想我们不需要又把呃呃windows二零零零呃windows七、windows八、windows十都观察一遍，就算它里头有变化，也换汤不换药。
它的这个设计原则呢就是这个样子。
好，这是这个单元。</p> <h2 id="_11-io-init-startup的第2项大工程🚀✔️"><a href="#_11-io-init-startup的第2项大工程🚀✔️" class="header-anchor">#</a> 11.<code>_io_init()</code> Startup的第2项大工程🚀✔️</h2> <p>我们已经非常详细的讲完了heap的初始化工作，以及他们后头的一些内存分配的动作。</p> <p>按照这个次序讲下去，后续就是IO的初始化。</p> <h3 id="ppt-侯捷对file的描述🚀"><a href="#ppt-侯捷对file的描述🚀" class="header-anchor">#</a> PPT.侯捷对file的描述🚀</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/image-20210705141818718.png" alt="image-20210705141818718"></p> <p>我们先来整理一下，我们对于file，文件的概念。我所要讲的观念，我其实已经很详细的表现在文字上了。所以，我们按照这个文件来解释。</p> <ul><li>==I/O一定要面对的是file==，IO泛指的是『这是个广义的』，这个包括了一般人狭义的理解的那个file，就是在磁盘硬盘里面开一个file那样，那是狭义的file。</li></ul> <p>I/O泛指程序和外界的各种交互作用，包括file，pipe，network，console，semaphore等等。或者泛指能被OS理解为file的任何事物——file是一种广义概念</p> <p><font style="background:yellow;">其实，<strong>我们这里要谈的IO的file是广义的</strong></font></p> <ul><li>我想很少有人关注FILE到底是什么。这个关系到我们要谈的启动代码对于IO的初始化，我们就要去理解FILE是什么。</li> <li>我们要注意我们是OS层面，还是更加高阶一点的C的层面，第2句话的意思：在你要创建一个file的时候，OS是给出一个fd，经过一些映射，包装之后才是你们C语言的东西。</li></ul> <h3 id="核心"><a href="#核心" class="header-anchor">#</a> 核心</h3> <ul><li>IO inititation就是要， 在client space（<strong>user mode，我们</strong>写成应用程序中能看的层面）中建立起每个Process（进程）一定可能会用到的stdin.stdout啥的，把他建立起来，建立起来干什么？</li> <li>也许后头，应用程序进入main之后，马上就能用到printf这些函数</li> <li>所以初始化的动作，就是把这些东西准备好。</li></ul> <p>下一页</p> <h3 id="ppt46"><a href="#ppt46" class="header-anchor">#</a> PPT46</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211125205548.png" alt="image-20211125205546594"></p> <p>io_init()这个函数相当大，对应的数据结构相当多。</p> <h3 id="_31-30就没有了✔️✔️✔️"><a href="#_31-30就没有了✔️✔️✔️" class="header-anchor">#</a> 31.30就没有了✔️✔️✔️</h3> <h3 id="ppt47"><a href="#ppt47" class="header-anchor">#</a> PPT47</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211125211657.png" alt="image-20211125211655127"></p> <ul><li>这个线之上，是IO初始化的行为。</li> <li>我们==整个课程是CRT的启动码。==
<ul><li>CRT对应的是user mode</li></ul></li></ul> <h2 id="_12-cinit-startup的第3项大工程🚀✔️"><a href="#_12-cinit-startup的第3项大工程🚀✔️" class="header-anchor">#</a> 12. <code>__cinit()</code> Startup的第3项大工程🚀✔️</h2> <h3 id="ppt48"><a href="#ppt48" class="header-anchor">#</a> PPT48</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211125205301.png" alt="image-20211125205300079"></p> <p>好，在我们直接下去之前呢，在强调一次啊，大家也注意</p> <ul><li><p>这个<code>_io_init()</code> 啊==重点在47页==，==最大的重点在47页和48页==。而这是同样的故事啊，各位。</p></li> <li><p>这上面都有编号嗯。一定要反复反复的看啊，这些编号可以。很大的帮助你呃。把一些话剧的东西把它连接在一起</p></li> <li><p>好。这整理一次哦。你。这个_i o_i n i t 的代码使得使得你的程序。在启动这这一开始的时候就获得了一个静态的数组啊，<strong>因为是数组，所以我叫他静态</strong>。啊，数组这些数组里面啊，64个可最最多可以六十四根指针，每一根指针指出来是这样32个东西，所以六十四乘以三十二，你的程序最多可以开2048个file，这是广义的file。</p></li> <li><p>而每一个这个东西长的是这种样子。「ioinfo」他里头有一些kernel mode的数据。（指着osfhnd）
我们是user mode 的，==我们写程序，user mode 是看不到这个的。所以中间要有一个桥梁==。那我们应用程序能看到的user mode 看到的是这样（指着FILE），你fopen 开启得到的是poninter指针指向这个结构。这个结里面的这个整数。他是这样子解释**，这里有六个bit at，这里有五个bit。it 就靠着这2组Bits。去找出这呃，最多2048里面的某一个**，我们一个每一个是什么？是这种东西吗？</p></li> <li><p>==这样终于对应起来啦==。你这个是user mode 去把它找出来，找到这边有kernel mode的东西。</p></li> <li><p>好，然后我们才可以开始我们的c、 c ++程序，才可以借着这一个指针（指着FILE）开始去write</p></li> <li><p>去写到file去或read 去读出来，<strong>中间这些过程呢，当然我们就不必管了，但是他们之间对应关系，我们借着这个图就很了解了。</strong></p></li> <li><p>好，四十七四十八页到四十八页这里。
刚刚四十七页有谈到，在第二段就谈到了啊，这里要去取得：继承而来的file handle。
继承而来的最重要有三个嘛，
1.In out ,标准的in标准的out标准的error。我们现在要来看看它是怎么去取得的。
就是第二段啊，这里的三和四啊，我们看下一页。
三和四我画的这个地方，这里的动作需要用到。</p></li> <li><p>io 初始化最前面的那一段。说明文字我们看一下最前面那一段说明文字，这是在第四十六页。
刚刚说这一段文字。会对各位有启发啊，所以。这几页主体结束这个主题，结束之后呢，还是希望你好好的看一下这些文字。</p></li> <li><p>这其中最重要的就是这一这一段我把它抄出来了。这一块啊，我现在抄到48页这里来放大，抄来这里。</p></li> <li><p>这边说什么呢？
说你要取得继承而来的file handle ，到底有几个，以及里面的数据是什么？他这边跟你讲，你要这么去取得他，你要获得一个starup information structure。这是什么东西呀？这个这个在。都可以找得到啊，这一个就是。那怎么去获得呢？靠这个函数getstarupinfo。</p></li> <li><p>注意我们整个课程是什么？是star 啊，启动代码啊启动吗？</p></li> <li><p>现在就是==windows 提供了一个函数==。在==他的启动代码里头呢，就调用windows 的这个函数==（指着getstarupinfo）要去取得了这样的结构，这就是这句话的意思。</p></li> <li><p>这一个结构里面，这个结构长什么样？子长这一种样子。其中现在要用到的就是蓝色的这一块，这是一个这个叫lpresolve2, the lp 表示是一个指针。我们看看他的说明。</p></li> <li><p>说这个继承而来的花样很多information。
是靠着这一根指针指的就是这个地方嘛，我已经把线条画出来了。
这是一根指针，他所指的东西要怎么去解释它呢？
我说。
这个format 这个格式是这样解释的，有三块内容，就这个指针指出去有三块内容。</p></li> <li><p>字节0-3是一个整数值，假设说叫n 好了，所以这个制剂字节零到三，这个就是n。
所以我们应该怎么办？我们写代码其实不是我们啊是这个这个io 初始化动作这里。</p></li> <li><p>他一定会调用这个函数，抓出这一个指针。抓出来以后，指针最前面四个字节把他当成一个整数这个n。
意思就是我到底继承了几个FILE Handler。也许是七个，也许三个月，也许八个。</p> <p>不知道嗯。接下来的这些。 如果这个啊这个N，那后面是什么？就是有n 个。n 个什么呢？n 个osfhnd
接下来又有n 个n 个什么n 个。handle value.</p></li> <li><p>==那这个os file 和handle value 是什么==？回到这边来看，这里不是有二零四八个这种东西吗？六十四乘以三十二，总共有二零四八。</p></li> <li><p>==每一个都是ioinfo。展开来是这样。==</p></li></ul> <p>刚刚你已经看过了，我已经带你。看看过一眼这里面有kernel mode之下下的一些东西，这个叫file handle，这个叫o s。five.
这两个栏目，这两笔数据。就是这两个东西。os five 就是这里os five 这个呢。
这个叫o s handle，就是这里的os file handle。==所以这里二零四八里面的最前面这这三个（stdio/stdiout.stdeer)。==</p> <p>==呃，一般来讲，你任何一个进程一定会继承到这3个==。
呃，现在这个代码里头就是借由调用这一个动作，取得这一根指针。</p> <p>这个地方我们按理想。至少是三啊或者3更多，然后这边就一个一个把它取出来。这里如果有n 个，这里就有n 个，这里就有n 个。一个一个取出来，填这里头。
==这里头去这3个是什么？填进来这三个每一个都是这种东西。（指着ioinfo）==
啊，我们就把它填进去了，这一个填到这里。</p> <p>那这个是什么？第三个字，这个现在不这个不是太重要的事情啊，我们后面看代码就会看得到。
啊，借由这种方式我们<strong>去copy。啊，我们或者叫登记</strong>叫登录记载继承而来的file hander</p> <h3 id="ppt49"><a href="#ppt49" class="header-anchor">#</a> PPT49</h3> <p>现在下一页看看代码是怎么写的。</p> <p>好，==我们看下一页啊，这这个是io 初始化里面的源代码==。</p> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211125211021.png" alt="image-20211125211020600"></p> <p>我们看下一页。</p> <p>中中间又经过了一些动作啊，这不是现在要讨论的。然后在这一行一百一十九行呢。
for look.
for 萝卜几次呢，从零次到那个n 次这个地方，这就是这个n。
到n 次一次一次的copy，每次copy。你看这边两根指针。
这两个指针的这个这个起点，<strong>每次copy 他就加加</strong>。
他就讲下这样就可以取出n 个。</p> <h3 id="ppt50"><a href="#ppt50" class="header-anchor">#</a> PPT50</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211125211326.png" alt="image-20211125211325247"></p> <p><strong>n 个什么刚刚已经解释过了，这边有n 个ofhnd</strong>
这里有n 个handle。
就一一的把它取出来，取出来以后把它塞到把它设定到这个地方去。
这里是什么？这里就是这两个栏目。
于是我们说。</p> <p><strong>经过了上一页这个源代码和这一页，这个源代码呢</strong>。
==我们就copy了父进程==。我们从parent 父父亲，父亲进城那边所获得的继承而来的fhnd
==按原则来讲，应该至少有这三个==。
好。
回到前面。</p> <p>这是第<strong>四十七页。</strong></p> <p>所以这一页提到啊，这里是这两个函数的总揽呢。
==我们现在把这条线以上的io 初始化动作以及摸得非常清楚了==。</p> <p><strong>后头呢？这两个函数。</strong>
这个是。==这里已经脱离了初始化行为==，就是后头要做事情的时候，比如说我们要fopen 的时候，我们应该怎么，我们应该想象。应该会是什么情况？<strong>这边条列出来，他应该会是什么情况呢</strong>？我们可以想象，我们再看下一页，==这里说一个进程最多可以容纳，可以拥有，可以开启==。二零四八个这种。</p> <p>所以回到上一页来，这个fopen 你可以想象他应该，啊再看一次下一夜这边。<strong>他应该会在这里面去找出一个没有用的，还没有备用的，找出一个来用，就代表了一个file。应该会这么做。的确是这样</strong>。</p> <h3 id="ppt47-2"><a href="#ppt47-2" class="header-anchor">#</a> PPT47</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211125211657.png" alt="image-20211125211655127"></p> <p>回到上一页，<strong>但是这个地方呢又更复杂一些。</strong> <strong>那这个复杂我已经用文字和图形画在这里了</strong>。我就不带你看了。不过他虽然变得比较复杂，<strong>他最终就是我刚刚所说的。要到这2048里面去取出一个来用</strong>。
如果以我们现在啊我我们其实整个课程在讲启动嘛，啊==启动嘛啊我们应该关注这个初始化==。
那么==已经全部谈完了==。</p> <h3 id="启动码的初始化全部讲完了"><a href="#启动码的初始化全部讲完了" class="header-anchor">#</a> 启动码的初始化全部讲完了</h3> <p>好，另外大家应该会很关注一点。我们的程序可以直接，<strong>c、 c++程序可以直接拿stdin</strong>.
<strong>因为简直可以把它当成一个关键字了啊</strong>，他虽然不是语言的东西，可是他是库里面的东西，已经定义的s t d e s dup 跟sp the error。</p> <p>==到底那是什么？==
我现在来解释这件事情。</p> <h3 id="ppt48-2"><a href="#ppt48-2" class="header-anchor">#</a> PPT48</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211125205301.png" alt="image-20211125205300079"></p> <p>我找到了一段源代码。
<strong>他对这三个做了一个define</strong>。
所以这三个名词或者说三个。
呃，在逻辑观念来讲，你说三个变量也可以，你说他是三个对象也可以。
<strong>反正这三个词呢这三个名词代表的就是这样的地址</strong>。</p> <p>第零个第一个第二个的地址，我们等下把它打印出来，看看是不是这个地址样子。
那这是什么？
这是什么？
<strong>化成图</strong>，这个叫i o b 的一个array <strong>，i ob 的一个array。</strong> <strong>这里原始有二十个</strong>。这样的东西每一个都是一个这种东西。（指着FILE）</p> <p>我怎么能说有这是第五号啊，我怎么能说这里有一个数组，有二十个呢，这5从哪来的呢？我怎么敢画这个图呢？
==回到上一页来，我说这两页你一定要一次的反复看==。</p> <p>我现在并没有把源代码展现给你看。不过啊我不会骗你人。源代码表现出来。用文字表示是这段话。
所以回到夏夜，我才能画出这个图。去观察他里面的内容，这里有前三个啊，被定义为，<strong>这3个地址，被定义为是跟win r a l。</strong>
==那里面的内容是什么呢？==
在这里。这每一个都是一个绿色的FILE，所以这里面的内容应该对应到这个绿色的fire 的一二三四五六七八八个栏目。</p> <p>我们来看看是不是呢一二三。啊，再一次啊，大家看斗点，仔细看这个逗点啊，一二二四零一二三，后面这个很长一串四，然后是蓝色的，这是五六。七。</p> <p>诶，（7个？？）是少了什么东西呢？我再再算一次，我们从下面这个这个比较短。
一开始闹。
呃，一一个两个、三个四个、五个、六个七个，这里应该有八个呀，我看看一二三四五。
五六七八。（应该要有8个啊）</p> <p>嗯==，我来解释一下==。
也许是他后面有个什么东西，这最后是什么？</p> <ul><li><p>最后叫temple file name</p></li> <li><p>你看倒数第二个叫buffer size，这的确实是一些数值数值啊，==但看起来是有默认的东西不必写。==
==啊，这样这样才解释的通。==</p></li> <li><p>好，那这里不是重点，重点是。
重点是这个里的第五个栏目，一二三四就==红色的这个叫_file 的东西==。</p></li> <li><p><strong>为什么这个最重要呢？刚刚都已经谈过了，这个东西可以解析成六个bit 和五个dit 啊他们。</strong> <strong>才可以找出这一堆的其中一个，所以这个是最重要的。</strong></p> <p>啊，这是我要解释的，我们写代码的时候会碰到这三个名词。
三个对象，三个变量啊，你叫他什么都可以，他其实只是他比方。
这里头的数据是这样，也就是这三个。
好，我们整个==i o initialization 都讲完了==，</p></li></ul> <p>最后我写一个。  程序刚刚你看第四十九页是代码的一个局部，有五十页是继续代码的局部就是要做一个copy。继承而来的发育很多。卡比上去，这刚刚都看过了。</p> <h3 id="我们整个-i-o-initialization-都讲完了"><a href="#我们整个-i-o-initialization-都讲完了" class="header-anchor">#</a> 我们整个==i o initialization 都讲完了==</h3> <h3 id="ppt51"><a href="#ppt51" class="header-anchor">#</a> PPT51</h3> <p><img src="https://cdn.jsdelivr.net/gh/HACV/picture/img/20211125215507.png" alt="image-20211125215506237"></p> <p>最后第五十一页我写一个test。
test 啊，我们看看我我写了些什么，我要test 什么事情呢？这是一个非常简单的c 的程序，这还。
还没用到什么c 加加的特性呢？</p> <p>==因为这个整个主题叫crt 嘛==，这所有的c、C++都是架构在这个之上啊，我来看看我做什么事情。</p> <p>啊，我刚刚说这是一个c 程序，其实这里用到了C++</p> <p><strong>三十二就是。  十六进位的二零对不对？这里石榴境外的二零。所以这些打印出来的地址。距离二零。</strong></p> <p>你看首先我们要确认，哎，我这样写代码是被认得的。
啊，这是呼应我们前面所学到的知识。我们可以这样写，这其实是指针。所以指针所指的那八个栏目里面的。**
<strong>第五个栏目。</strong>
叫这个名字。**
打印出来果然是零一。
所以有时候我们会说stdin是零standard。
out 的是e the error 是二，指的是这个意思。  其实是真的。instead of the, the error, 它是指针。</p> <p><strong>呃，这边特别用红色的标出来，就是正规的写法啊，你不一定打开会成功哦</strong>。</p> <p>当然不成功，有几种可能，一种就是<strong>代码错误，这是代码错误，不是你的责任，是crt 整个crt 写错了，但是机遇太低了啊。</strong></p> <p>==整个crt 全世界多少人几百万人，几千万人在用他，他几乎你可以信任他==。
所以第一个你没有责任。第二个呢，他也几乎不会写错。那这里什么时候会出错？
<strong>什么时候会打打开不成功了，就是呢1048个用光光了（233）</strong>。  没有了啊，那就会失败。
==当然你一个程序用到二零四八个hander，也是很少见。==</p> <ul><li>所以多半你没有检检测呢，也就。得过且过过去了，但正确其实要检测。</li></ul> <p>刚刚是三个标准的，现在呢我自己开启了一个，我也去看看这一个栏目。    那已经用掉了零一二了。    总共有二零四八嘛。    <strong>回</strong>头我看看这个图，这总共有二零四啊，已经用掉零一二。    我现在在开一个，那应该是三。**
看看这个执行结果啊，==的确是三==**。</p> <ul><li>接下来呢。
啊，我做了一些一些动作，随意的对这一个file 做一些动作表示这个不会上吊，只是成功的。然后我把它close 掉。c<strong>lose, 我们不知道close loss 发生什么事情啊，如果你想知道应该要去看源代码，我们没有我没有去看。</strong>
但是我接下来又做一个动作。
这close loss 之后。    先前的那一个指针。    所指的这个东西。    我仍然把它再打印一次这个重要的那一个栏目。  ==打印出来呢也不会宕掉，所以编译也通过执行，结果也是三，意思是什么==？</li> <li>​    回到前面来。    这里二零四八个。    这里是零一二，我刚刚fopen，我获得了。    这一块。
​    啊，或者说呃cr 基本身呢给了我这一块的使用权啊，换一个角度讲。    然后我把它close 掉。
​    close 掉之后呢，我继续去看他的内容仍然是三啊，我仍然可以看到他啊，内容也没变。    目前得到的结果是这样。    他也没有被摸清为零，或摸清为什么都没有？
​    再回到刚刚的测试程序来，这就是执行到这里了。</li></ul> <h3 id="fclose的底层！！"><a href="#fclose的底层！！" class="header-anchor">#</a> fclose的底层！！</h3> <ul><li>​    ==所以我这边有一段注解说什么？    f close 会归还file handle（重要）==。
​    但我们如果不小心的继续去用它。    是可能出错了，因为他并没有把它清为零等等，这个要注意。</li> <li>​    ==我那么这样，我为什么说这个会归还file handle？我怎么能讲这句话呢？看起来他没有做处理啊==。</li> <li>因为这个代码接下区域就是这样子看啊，从这里接触到这里来，我又open 一次，我刚刚已经open 一次，然后把它关掉。    然后我在open 一次。    然后看看他的值这个重要的这个栏目的值又是三。</li> <li>回到这个测试程序来。    好，所以已经解释到这里了。    接下来这个文字说了。    open 60次，我们有close，我就连续等于说我开启六十个f 是这样子写的，这里六十个指针。</li> <li>​    for loop 六十次。    每一次开启，我都把那个很重要的那个栏目那个数据打印出来。    啊，我们就会看到那个零一二已经被标准了，那三个占占用了。</li> <li>​    第三个呢，零一二占用了，那么帆呢三刚刚被用了又关掉啊。    被打开又被关掉又被打开又被关掉。所以三可以再次的使用。所以这里又出现三。    <strong>总共开了六十次，所以三到六十二，这就是六十次</strong>。    也就相当于在这一张图。</li> <li>​    啊，在这一张图里头换了一个角度。在这张图里头啊，我们用掉了总共几个呢？    六十个加上前面的。
​    标准的三个用掉了那么多。要。 用订单，那是用掉几个六十三个了。</li></ul> <p>这个总共才几个？32个还记得吗？每一次分配是三十二。
所以当32不够的时候，==第33个这个代码里头啊就会从这里在动态分配出另外的==。一大组。另外的三十二个来用，就这样依序的进行下去，<strong>最多可以供应2048</strong>（指着绿色图，的左边第2格）</p> <ul><li>==好，这个是IO初始化的所有的故事==</li></ul> <h2 id="cinit-感觉没有讲🚀🚀"><a href="#cinit-感觉没有讲🚀🚀" class="header-anchor">#</a> <code>__cinit()</code> 感觉没有讲🚀🚀</h2> <h2 id="参考资料"><a href="#参考资料" class="header-anchor">#</a> 参考资料</h2> <ul><li>侯捷 - C++ Startup 揭密：C++ 程序的生前和死后 （一）_Jeff_的博客-<a href="https://www.cxyzjd.com/article/weixin_40539125/100631710" target="_blank" rel="noopener noreferrer">程序员宅基地<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li> <li>侯捷c++STL<a href="https://densecollections.top/posts/houjieC++STL/" target="_blank" rel="noopener noreferrer">体系结构与内核分析<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li> <li>参考视频链接：<a href="https://www.bilibili.com/video/BV1WJ411k7Dq?p=12" target="_blank" rel="noopener noreferrer">B站<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li> <li>参考的CSDN的<a href="https://blog.csdn.net/weixin_40539125/article/details/102418922" target="_blank" rel="noopener noreferrer">PPT<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></li> <li>C++<a href="https://mooc.study.163.com/smartSpec/detail/1001137001.htm" target="_blank" rel="noopener noreferrer">网易云微专业<svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a>，侯捷</li></ul></div> <div class="page-edit"><!----> <!----></div> <!----> </div> <!----></div></div>
    <script src="/assets/js/app.c70e21ad.js" defer></script><script src="/assets/js/32.063c672d.js" defer></script>
  </body>
</html>
